我想向Spring Boot应用程序注入一些非弹簧托管豆。我本来会认为这样做的方法是:
GenericApplicationContext parentContext = new StaticApplicationContext();
parentContext.getBeanFactory().registerSingleton("pipeline", pipeline);
parentContext.refresh(); // seems to be required sometimes
ApplicationContext context = new SpringApplicationBuilder()
.sources(parentContext)
.child(DispatcherApplication.class)
.run();
但是,您只能将Class<?>...
或Object...
传递到构建器上的sources
方法,在后一种情况下,其唯一识别的值是:
- 类 - 由AntotatedBeanDefinitionReader加载的Java类
- 资源 - XMLBeanDefinitionReader加载的XML资源,或GroovyBeanDefinitionReader加载的Groovy脚本
- 软件包 - 由ClassPathBeanDefinitionScanner扫描的Java软件包
- charsequence-班级名称,资源句柄或包装名称,以适当加载。
那么,如何将父上下文实例传递,或者在启动之前将单单套件注入Spring Boot应用程序?
tia
您不必使用应用程序构建器使用修改的上下文创建应用程序。
只需确保您自动 parentContext 并在从其衍生的工厂
我无法获得您的父上下文方法的工作,或多或少与您说明的原因相同。相反,我:
- 用
@Lazy
和@Autowired
注释bean - 创建一个匿名
ApplicationListener
- 在听众调用
getBeanFactory().registerSingleton()
中 - 使用
setListener()
将侦听器添加到应用程序
这是剥离的听众:
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
((GenericApplicationContext) (((ContextRefreshedEvent) event)
.getApplicationContext()))
.getBeanFactory().registerSingleton("legacyBean", obj);
}
}
我没有在应用程序生命周期上找到太多文档,但是至少我正在做的大部分是标准的。但是,它确实依赖于"对我有用"的GenericApplicationContext
的上下文演员表(Spring Boot 1.4.1),并且看起来很安全,但是从理论上讲,将来可以改变版本
我的博客文章具有完整的来源:http://blog.nqzero.com/2018/01/integrating-spring-with-legacy-app.html