将Bean注入到Spring托pipe上下文之外的类中

我是我公司产品的最终用户。 它不是很适合集成到Spring中,但是我能够获得上下文的句柄并按名称检索所需的bean。 但是,我仍然想知道是否可以向这个类中注入一个bean,尽pipe这个类不是由Spring本身pipe理的。

说明:pipe理某个类MyClass生命周期的同一个应用程序也在pipe理Spring上下文的生命周期。 Spring对MyClass的实例没有任何的知识,我想一些如何将实例提供给上下文,但不能在上下文本身中创build实例。

你可以这样做:

ApplicationContext ctx = ... YourClass someBeanNotCreatedBySpring = ... ctx.getAutowireCapableBeanFactory().autowireBeanProperties( someBeanNotCreatedBySpring, AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true); 

您可以在YourClass使用@Autowired等来指定要注入的字段等。

假设你有以下依赖链:

A→B→C→x→y→Z

A,B,C是弹簧pipe理的bean(由spring框架构build和pipe理)x,y是非常简单的POJO,由您的应用程序构build,没有弹簧协助

现在如果你希望y会得到一个使用spring的引用,那么你需要在Spring ApplicationContext中有一个“句柄”

一种方法是实现ApplicationContextAware接口。 在这种情况下,我会build议A,B或C将实现此接口,并将applicationContext引用存储在一个静态成员。

所以我们以C类为例:

 class C implmenets ApplicationContextAware{ public static ApplicationContex ac; void setApplicationContext(ApplicationContext applicationContext) { ac = applicationContext; } ............. } 

现在,在Yclass你应该有:

 (Z)(C.ac.getBean("classZ")).doSomething() 

HTH – Yonatan

search无尽的autowire组合注入spring bean到pojo applicationcontextaware beanaware等圈我回到这里,但这并没有提供一个完整的解决scheme给我。

这是一个更好的实施/这个国际海事组织的教程:我希望它可以帮助每个人喜欢它终于帮助我。

从Spring上下文访问Spring Bean

另一种方法是使用AspectJ。 这是将Spring bean注入到使用new运算符创build的非托pipe对象中的推荐方法。 查看详情:

http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html

一种将Spring引入Spring的方法是使用标记为@Configuration bean的helper类,该bean有一个方法(标记为@Bean ),它实际上创build了实例,并通过Spring将其传回财产注入和代理生成)。

我不太确定你需要什么范围。 与prototype ,你会得到一个新鲜的豆在每个地方。

 @Configuration public class FooBarMaker { @Bean(autowire = Autowire.BY_TYPE) @Scope("prototype") public FooBar makeAFooBar() { // You probably need to do some more work in here, I imagine return new FooBar(); } } 

您可以将制造所需的属性注入到@Configuration bean中。 (我使用它来创build一个接口的实例,在运行时定义要实例化的类的名称。)

请注意,在Spring的最早版本中,bean工厂存在线程安全问题http://jira.springframework.org/browse/SPR-4672

如果您想在Spring上下文之外创build一个对象,并使该对象可用于注入Spring上下文中的其他bean, 可以按照本文中的步骤进行操作。

基本上,您创build一个父应用程序上下文,并将您的外部对象作为一个单身进入这个父上下文。 然后,以父应用程序上下文作为其父项,创build主应用程序上下文(例如,从xml文件)。

 Object externalObject = ... GenericApplicationContext parent = new StaticApplicationContext(); parent.getBeanFactory().registerSingleton( "externalObject", externalObject ); parent.refresh(); ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);