将单例注入Spring Boot Application Context

时间:2017-12-20 17:10:57

标签: java spring spring-boot parent-child applicationcontext

我想将一些非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方法,在后一种情况下,它识别的唯一值是:

  • Class - 由AnnotatedBeanDefinitionReader
  • 加载的Java类
  • 资源 - 由XmlBeanDefinitionReader加载的XML资源,或由GroovyBeanDefinitionReader加载的groovy脚本
  • 包 - 由ClassPathBeanDefinitionScanner
  • 扫描的Java包
  • CharSequence - 要根据需要加载的类名,资源句柄或包名。

那么我如何传入父上下文实例,或者在启动之前将单例注入Spring Boot应用程序?

TIA

2 个答案:

答案 0 :(得分:0)

您不必使用Application Builder为修改后的上下文创建应用程序。

只需确保您自动装配 parentContext 并在从其派生的工厂中注册单件

答案 1 :(得分:0)

我无法让你的父上下文方法工作,或多或少与你说的相同。相反,我:

  • 使用@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