2016-06-30 32 views
0

請在標記重複之前完成問題。可以在評論中討論更多通過構造器注入在其他bean中連接條件bean

我有以下代碼,其中ServiceA依賴於ServiceB。而serviceB實現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 
    } 

} 

我不能自動檢測ServiceA豆,因爲我需要在一些關鍵的一個Map注入它。 我看到的一個選擇是刪除構造注入,並在serviceA中有serviceB bean @autowired,這對我來說是最後一個選項。還有其他選擇嗎?

編輯:我不想在注射期間有if-else,因爲這些bean可以在不同的地方定義。我將只使用@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

沒有持有你從自動裝配生成的ServiceB權的配置類內重用參考它創建ServiceA

@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的場景。