2015-11-20 145 views
0

我只是在研究DI框架的可能性,我做了一些愚蠢的例子。我有簡單的服務。CDI和多個實例

public class Service implements ServiceI { 
    private Source source; 

    private Translator translator; 

    @Inject 
    public Service(Translator translator, Source source) { 
     this.translator = translator; 
     this.source = source; 
    } 

我想要這個服務的兩個實例,一個是用TranslatorA和SourceA啓動的,另一個是用不同的值注入的。

怎麼能有兩個不同的bean注入內部的實例?

我對如何在Guice和Weld CDI中實現這一點感興趣。

到目前爲止,我創建了多個Guice模塊,並在其中指定了綁定。但我不完全確定它是否正確。由於沒有模塊,這在CDI中完全失敗。

我有多個實例必須是相當常見的情況下還是我錯了?

+0

在春天,您可以使用@Bean方法並手動設置依賴項,但是如果我將在CDI中使用新的bean,則不會管理該bean,對吧? – Zveratko

回答

0

你會這樣做與CDI的方式是通過設立一個翻譯和源的生產者。這是控制在運行時用於注入的實現的唯一方法。實施細節可能會因您的具體需求,但這樣的事應該讓你在正確的軌道

@Produces 
public Translator produceTranslator(@Dependent TranslatorA implA, @Dependent TranslatorB implB) { 
    return checkRuntimeCondition() ? implA : implB; 
} 

與同爲來源。這樣,當你注入Service時,CDI將調用每個參數的生產者方法,並使用運行時條件來選擇實現。 YMMV的詳細信息,您可能需要設置其他限定符以避免含糊不清。

+0

如果我想要'@Inject ServiceI serviceWithTransaltorA'和同一個類'@Inject ServiceI serviceWithTranslatorB'?我應該這樣做創建兩個服務生產者? – Zveratko

+0

擁有多個生產者並不是問題,只要你嫺熟地解決它們之間的歧義。這可以通過限定符完成。 – jvalli

+0

所以像'@Inject @TranslatorA @SourceA ServiceI serviceWithTransaltorA'和'@Inject @TranslatorB @SourceB ServiceI serviceWithTransaltorB' – Zveratko