2016-06-30 5 views
0

重複をマークする前に完全な質問をしてください。コメントでもっと議論することができますコンストラクタインジェクションを使用して他のビーンに条件付きビーンを配線する

ServiceAがServiceBに依存する次のコードがあります。そしてserviceB実装Beanは、条件付きで、私はいくつかのキーと地図でそれを注入する必要があるとして、私は、サービスA Beanを自動検出することはできません

class ServiceA{ 
    ServiceB serviceB; 
    ServiceA(ServiceB serviceB){ 
     this.serviceB = serviceB; 
    } 
} 


@Configuration 
class AppConfig{ 
    @Conditional("some_condition_based_on_property") 
    @Bean 
    ServiceB serviceB1(){ 
    return new ServiceBImpl1(); 
    } 

    @Conditional("some_condition_based_on_property") 
    @Bean 
    ServiceB serviceB2(){ 
    return new ServiceBImpl2(); 
    } 

    @Bean 
    ServiceA serviceA(){ 
    //what should go here so that conditional bean is injected in ServiceA 
    } 

} 

を初期化されます。 私が見ることの1つのオプションは、建設注入を取り除き、serviceAにserviceB bean @autowiredを持たせることです。これは私の最後のオプションです。その他のオプションは?

編集:私は注射中にif-elseをしたくないです。豆はさまざまな場所で定義できるためです。私は何が正しいの構成クラス内結果ServiceBをオートワイヤリングとServiceAを作成するための参照にそれを再利用するからあなたを保持していない@Conditional

+0

可能な複製http://stackoverflow.com/questions/19225115/how-to-do-conditional-auto-wiring-in-spring? – aksappy

+0

あなたはhttp://stackoverflow.com/questions/19225115/how-to-do-conditional-auto-wiring-in-springを確認できます –

+0

質問が更新されました。関連する質問は私の特定の問題を解決しません – sidgate

答えて

1

を使用することになります。

@Configuration 
class AppConfig{ 
    @Conditional(/* some condition */) 
    @Bean 
    ServiceB serviceB1(){ 
    return new ServiceBImpl1(); 
    } 

    @Conditional(/* some condition */) 
    @Bean 
    ServiceB serviceB2(){ 
    return new ServiceBImpl2(); 
    } 

    // store a local reference  
    @Autowired 
    private dynamicServiceB; 

    @Bean 
    ServiceA serviceA(){ 
    return new ServiceA(dynamicServiceB); 
    } 
} 

あなたが仕事にしようとしているようしかし、それは感じています文法的に間違ったコードが含まれているとしたら、あなたが記述しなかった問題があります。@Conditionalは文字列を値として受け入れません。あなたは、あなたが持っているコードの壊れたビットを扱っている人に受け入れられる解決策が、大きな成功を収めることを期待するべきではありません。

これは@Profileのシナリオのようです。

関連する問題