我是我公司产品的最终用户。它不太适合集成到Spring中,但是我能够获取上下文的句柄并按名称检索所需的bean。然而,我仍然想知道是否可以向这个类中注入一个bean,尽管这个类不是由Spring自己管理的。说明:管理某些类MyClass的生命周期的同一个应用程序也在管理Spring上下文的生命周期。 Spring没有任何有关MyClass实例的知识,并且我想介绍一下如何将实例提供给上下文,但不能在上下文本身中创建实例。向Spring管理的上下文中注入Bean
回答
你可以ñ做到这一点:
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
您可以使用@Autowired
等内YourClass
指定字段注入等
假设u有以下依赖关系链:
A - >乙 - “ç - > X - >ý - >ž
A,B,C被弹簧管理豆类(构建和Spring框架manged) x,y是由应用程序构造非常简单的POJO,无弹簧辅助
现在,如果你想使y将获得到Z利用弹簧的参考,你需要有一个'处理'到春季ApplicationContext
一个办法就是实现ApplicationContextAware接口。在这种情况下,我会建议A,B或C将实现此接口,并将applicationContext引用存储在静态成员中。
所以让我们例如C级:
class C implmenets ApplicationContextAware{
public static ApplicationContex ac;
void setApplicationContext(ApplicationContext applicationContext) {
ac = applicationContext;
}
.............
}
现在,Y类,你应该有:
(Z)(C.ac.getBean("classZ")).doSomething()
HTH - Yonatan
要小心,在旧版本春天豆厂有线程安全问题http://jira.springframework.org/browse/SPR-4672
搜索自动装配无休止的连击注入Spring Bean注入POJO了ApplicationContextAware beanaware等围住我回到这里,但这没有为我提供一个完整的解决方案。
这是一个更好的实施/教程这个国际海事组织: 我希望它可以帮助每个人喜欢它终于帮助了我。
另一种方式做,这是我们用AspectJ。这是向使用new
运算符创建的非管理对象注入Spring Bean的推荐方式。有关详细信息,请参阅本:
http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
的一种方式,尽管其制造是外部带来一个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中。如果你想创建一个对象外 Spring上下文,并提供用于注射该对象到(我用它来创造一个类实例的名称在运行时定义的接口的实例。)
其他豆类是在Spring上下文是,您可以按照this article步骤。
基本上,你创建一个父应用程序上下文,并把你的外部对象到作为一个单此父上下文。然后,您创建主应用程序上下文(例如,从xml文件),并将父应用程序上下文作为其父项。
Object externalObject = ...
GenericApplicationContext parent = new StaticApplicationContext();
parent.getBeanFactory().registerSingleton("externalObject", externalObject);
parent.refresh();
ApplicationContext appContext = new ClassPathXmlApplicationContext(... , parent);
- 1. 注入Spring管理的SessionFactory的bean在JSF托管bean
- 2. struts2注释spring管理bean
- 3. 如何向Spring中注入Spring bean DefultProducer
- 4. 向EJB3注入Spring bean
- 5. 向EJB3注入Spring bean
- 6. 向Spring bean注入文件资源
- 7. 向spring bean注入xml文件
- 8. 如何将Spring bean注入到Seam上下文中?
- 9. 如何将Spring管理的服务bean注入Apache CXF Servlet
- 10. Spring bean未注入
- 11. 如何向Apache Wink注入Spring bean?
- 12. 向Spring bean注入依赖关系
- 13. 在JSF中注入Spring依赖项使用Spring 2.0管理的bean
- 14. 在Spring Bean中注入ResourceBundle
- 15. 成功注入的Spring bean上的NullPointerException
- 16. 在Groovy bean中注入Spring bean
- 17. Spring管理的JSF bean
- 18. JSF 2.0的Spring bean注入
- 19. 的Spring bean字段注入
- 20. Spring Bean注入时的ClassNotFoundException
- 21. 性能问题JSF - 托管Bean内部管理Bean注入
- 22. 管理bean中的spring service null
- 23. Spring管理bean中的@ManagedProperty为空
- 24. JSF + Spring中的Bean Scopes管理
- 25. Spring Boot中Bean管理的模式
- 26. 如何避免从上下文中检索Spring托管bean
- 27. 将Spring bean注入RestEasy
- 28. Apache CXF spring bean未注入
- 29. Spring 3不注入DAO bean
- 30. 将FacesContext注入Spring bean
请澄清一下:您想通过Spring配置,Spring动态地在运行时注入bean,还是通过setter方式编程? – 2008-11-21 21:45:06
任何方法都可以。关键是应用程序已经创建了我想要注入一个bean的对象,所以原始对象不由Spring上下文管理。 – 2008-11-21 22:01:21
另外,可以考虑使用一个工厂方法,所以你可以把班级分成应用程序上下文并将其配置为每一个普通的Spring bean。查看关于bean工厂的Spring参考文档。 – cletus 2008-11-22 00:54:25