向Spring Boot应用程序上下文注入单例



我想向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

最新更新