我是我公司产品的最终用户。它不太适合集成到Spring中,但是我能够处理上下文并按名称检索所需的bean。但是,我仍然想知道是否可以将bean注入到这个类中,即使该类不是由Spring本身管理的。
澄清:管理某些类MyClass生命周期的同一个应用程序也在管理Spring上下文的生命周期。 Spring对MyClass的实例没有任何了解,我想知道如何将实例提供给上下文,但不能在上下文本身中创建实例。
答案 0 :(得分:55)
你可以这样做:
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
您可以在@Autowired
中使用YourClass
等来指定要注入的字段等。
答案 1 :(得分:2)
假设你有以下依赖链:
A - > B - > C - > x - > y - > ž
A,B,C是弹簧管理的bean(由spring框架构建和管理) x,y是由您的应用程序构建的非常简单的POJO,没有弹簧帮助
现在如果你想要y将使用spring获得对Z的引用,你需要对spring的一个'句柄'ApplicationContext
实现此目的的一种方法是实现ApplicationContextAware接口。在这种情况下,我建议A,B或C将实现此接口,并将applicationContext引用存储在静态成员中。
所以我们以C类为例:
class C implmenets ApplicationContextAware{
public static ApplicationContex ac;
void setApplicationContext(ApplicationContext applicationContext) {
ac = applicationContext;
}
.............
}
现在,在课堂上你应该:
(Z)(C.ac.getBean("classZ")).doSomething()
HTH - Yonatan
答案 2 :(得分:2)
将bean引入Spring的一种方法是使用标记为@Configuration
bean的辅助类,该类具有实际生成实例的方法(标有@Bean
)将它交给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。 (我用它来创建一个接口实例,其中要实例化的类的名称是在运行时定义的。)
答案 3 :(得分:1)
搜索无限组合的autowire注入spring bean到pojo applicationcontextaware beanaware等圈回我这里但是这并没有为我提供一个完整的解决方案。
这是一个更好的IMO实现/教程: 我希望它能帮助每个喜欢它的人最终帮助我。
答案 4 :(得分:1)
另一种方法是使用AspectJ。这是将Spring bean注入使用new
运算符创建的非托管对象的推荐方法。有关详细信息,请参阅此处:
http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
答案 5 :(得分:0)
请注意,在最旧版本的Spring中,bean工厂存在线程安全问题http://jira.springframework.org/browse/SPR-4672
答案 6 :(得分:0)
如果要在Spring上下文中创建一个外部对象,并使该对象可以注入到Spring上下文中 的其他bean中,则可以按照this article中的步骤。
基本上,您创建父应用程序上下文并将外部对象作为单例推送到此父上下文中。然后,您将创建主应用程序上下文(例如,从xml文件),并将父应用程序上下文作为其父项。
Object externalObject = ...
GenericApplicationContext parent = new StaticApplicationContext();
parent.getBeanFactory().registerSingleton( "externalObject", externalObject );
parent.refresh();
ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);