将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);