2017-03-20 3 views
0

既に初期化されたBeanのリストを別のものに挿入する必要があります。初期化されたBeanのリストを挿入する

私は環境に応じて使用されるいくつかの怠惰な豆の定義を持つクラスを持っている - だけimpl1impl2が使用され、サーバー上のサーバー1上のような2 impl3impl1

@Component 
class Definitions { 
    @Bean 
    @Lazy 
    public A impl1() { /* ... */ } 

    @Bean 
    @Lazy 
    public A impl2() { /* ... */ } 

    @Bean 
    @Lazy 
    public A impl3() { /* ... */ } 
} 

そして、私はいくつかの監視を行っています環境について何を知っているだけで、アクチュエータのためのいくつかの健康情報を暴露するすべてのそれらのA豆を収集していない豆:

@Component 
class Monitoring implements HealthIndicator { 
    @Autowired 
    private List<A> monitored; 
} 

P汚れは、前もって初期化されていなくても、すべての豆がmonitoredに入っているスプリングワイヤーです(これは、すべてのものをクラッシュさせるため、適切な環境がないためです)。そして、私は何らかの形で春に、すでに初期化された豆だけが必要であることを説明する必要があります - @AutowireOnlyThoseLazyBeansWhichAlreadyBeenUsedSomewhereElse

P.S.私は汚れたハックを使用してDefinitionsのリストプロパティを宣言し、Beanのファクトリメソッドでそれを記入し、そのリストを参照する別のBeanを登録することができますが、それはあまりにも汚いです。

+0

たぶん '@Autowired(required = false)'を使うことができますか? –

+0

@RandallFlagg、それは貧しい環境でアプリケーション全体がクラッシュするようにBeanの賢明なインスタンス化を強制します。だから、期待通りに動作しないか、豆が即座にインスタンス化されないようにする必要があります。 – smt

+0

プロファイルを使用し、異なるサーバーで適用するプロファイルを指定します。 –

答えて

0

解決策は、BeanPostProcessor経由で特定のタイプの監視Beanを使用してカスタムOSGiのような「ServiceTracker」を作成し、すべての追跡Beanを動的Beanに登録することでした。

関連する問題