我有一个在Spring之外创建的类的实例,我想访问Spring bean,以便它可以触发一个事件并被Spring bean观察到。我没有使用Spring Web,我的应用程序是通过spring引导从命令行运行的。春季启动应用程序 - 从静态上下文获取bean
回答
您可以通过构造函数Spring bean的注入,是这样的:
@Service
class Bean {
...
}
class NotBean {
private Bean bean;
public NotBean(Bean bean) {
this.bean = bean;
}
// your stuff (handle events, etc...)
}
你唯一的选择是使用一个静态方法来使您的应用程序的Spring上下文,使得不被管理的对象Spring可以使用它来获取它所需的托管bean的引用。
从上下文的包装开始。创建一个需要在其构造函数中引用上下文的常规托管bean。参考被分配到一个静态类领域的,也有静态的getter:
@Service class ContextWrapper { private static ApplicationContext context; @Autowired public ContextWrapper(ApplicationContext ac) { context = ac; } public static ApplicationContext getContext() { return context; } }
使用静态吸气以访问对象上下文中未由Spring管理,并得到参考使用方法豆在上下文中可用:
SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class); // do something with the bean
你需要的最后一件事是从Spring bean的通信信道的非托管对象。例如,
SomeBean
可以公开一个setter,它将接受非管理对象作为参数,并将该引用存储在字段中供将来使用。对象mast使用上面提到的静态上下文访问器来获取对托管bean的引用,并使用setter来让bean知道它的存在。@Service class SomeBean { // ... your bean stuff private SomeClass someclass; public void setSomeClass(Someclass someclass) { this.someclass = someclass; } private void sendEventToSomeClass() { // communicate with the object not managed by Spring if (someClass == null) return; someClass.sendEvent(); } }
我如何确保上下文不为空或不完全加载?我可以依赖getContext()将返回完整的春天上下文,为什么? – user7294900
如果您的Spring应用程序已启动,则必须正确创建上下文。你唯一需要记住的是你不应该在bean的构造函数中使用'getContext()'方法,因为bean的构建是创建上下文的一部分。 –
当从一个**常规(非spring)类**调用获取一个bean时,我可以假设spring上下文已经启动了吗?是否需要添加检查/函数以确保spring上下文不为null或未完全加载? – user7294900
- 1. 春季应用程序启动
- 2. 春季启动Web应用程序不提供静态内容
- 3. 父应用程序上下文在春季启动
- 4. 的WebSocket在春季启动应用程序 - 获取403禁止
- 5. 与MySQL的春季启动应用程序获取“java.sql.SQLNonTransientConnectionException”
- 6. @ModelAttribute在春季启动应用程序
- 7. 春季启动vaadin静态内容
- 8. 春季启动Maven的web应用程序文件夹和ResourceHandler
- 9. 无法在春季启动应用程序访问和使用静态资源
- 10. 获取启动器启动的应用程序的上下文
- 11. 从Groovy类中的应用程序上下文获取spring bean
- 12. 春季应用程序启动期间的其他API调用
- 13. 对角和春季启动应用
- 14. 春季启动应用程序不会在openshift中启动
- 15. 春季启动 - 从
- 16. 从春季启动应用程序连接到MongoDB使用ssl
- 17. 从Android应用程序验证春季启动应用程序(使用jwt)
- 18. 春季启动应用程序的测试策略建议
- 19. 春季启动应用程序不启动嵌入式tomcat
- 20. 春季启动JSP没有找到我的春节,启动应用程序
- 21. Java Web应用程序。春季启动。定位图像
- 22. 在Heroku上的春季启动 - H10“应用程序崩溃”
- 23. 春季启动应用程序不Glassfish上部署4.1
- 24. 春季安全:会话处理在应用程序启动
- 25. 春季启动应用程序未运行
- 26. 春季启动 - 启动
- 27. 春季启动应用程序时,挂在命令行运行
- 28. 春季启动ApplicationPidListener
- 29. 仅在春季启动应用程序中发生UnknownFieldException
- 30. 用Thymeleaf静态资产获取重复日志语句的春季启动
我没有在其他NotBean是如何被实例化,因此,我不能简单地通过bean的引用给它控制... – Walter
你可以从NotBean延伸? –