2017-12-20 25 views
0

Spring以外の管理対象BeanをSpring起動アプリケーションに注入したいとします。シングルスレッドをSpring起動アプリケーションコンテキストに注入

:あなたが唯一のビルダーで、それが認識値のみである後者の場合には sources方法に Class<?>...または Object...に渡すことができますしかし

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(); 

:私はこれを行う方法のようなものだろうと思っているだろう

  • クラス - GroovyBeanDefinitionReader
  • によってロードされるようにXmlBeanDefinitionReader、またはグルーヴィーなスクリプトによってロードされるようにXMLリソース - JavaクラスはAnnotatedBeanDefinitionReaderによって
  • リソースをロードします
  • パッケージ - ClassPathBeanDefinitionScannerによってスキャンされるJavaパッケージ
  • CharSequence - 適切にロードされるクラス名、リソースハンドルまたはパッケージ名。

私は親コンテキストインスタンスを渡すか、起動前にSpringBootアプリケーションにシングルトンを挿入するにはどうすればよいですか?

TIA

答えて

0

Application Builderを使用して、変更されたコンテキストでアプリケーションを作成する必要はありません。

は単純に必ずAutowire parentContext作り、それが

+0

私は完全に次のことを確信しています。 – SilentICE

0

私はあなたの親コンテキストのアプローチは、あなたが述べたのと同じ理由多かれ少なかれのために、仕事を得ることができませんでしたから派生工場でシングルトンを登録します。その代わり、私は:

  • 注釈@Lazy@Autowired
  • を持つBeanは、ここにあるsetListener()

でアプリにリスナーを追加するリスナーコールgetBeanFactory().registerSingleton()

  • で匿名ApplicationListener
  • を作成します除外されたリスナー:

    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

  • 関連する問題