我想将一些非Spring托管bean注入Spring Boot Application。我本以为这样做的方法就像:
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
方法,在后一种情况下,它识别的唯一值是:
那么我如何传入父上下文实例,或者在启动之前将单例注入Spring Boot应用程序?
TIA
答案 0 :(得分:0)
您不必使用Application Builder为修改后的上下文创建应用程序。
只需确保您自动装配 parentContext 并在从其派生的工厂中注册单件
答案 1 :(得分:0)
我无法让你的父上下文方法工作,或多或少与你说的相同。相反,我:
@Lazy
和@Autowired
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