2011-06-29 23 views
3

假設我擁有類型爲IStrategy的屬性策略的類控制器。在春天,我可以創建控制器的不同實例和如下所示通過定義在XML配置文件豆注入不同的策略實現:Java EE 6注入創建不同的策略

<bean id="strategyAController" class="com.test.Controller"> 
    <property name="strategy" ref="strategyAImpl"> 
</bean> 

<bean id="strategyBController" class="com.test.Controller"> 
    <property name="strategy" ref="strategyBImpl"> 
</bean> 

<bean id="strategycController" class="com.test.Controller"> 
    <property name="strategy" ref="strategycImpl"> 
</bean> 

我然後可以參考使用@Autowired和@Qualifier這些豆(「strategyAController」)等等。在Java EE 6中執行此操作的等效方式是什麼?

回答

4

有趣的你應該問一下!設計Java EE 6 CDI的Gavin King在與同一問題上的某人發生了一場討厭的戰鬥。

http://www.tsolak.com/?p=59

Spring的代碼,當然,看起來非常像Java。我們可以在java中做到這一點 - 創建一些變量,設置一些屬性,沒有biggie。我很好奇,在你的應用程序中,在普通Java中做這件事有什麼缺點?你從Spring獲得這些豆的具體好處是什麼?

+1

哇。不是在這裏開始迷你戰爭,但加文在那裏是錯誤的。或者至少他對於Spring的注入顯然比EE更靈活的情況是防禦性的。 – jiggy

+0

感謝您的鏈接。 >>在普通的Java中做這件事有什麼缺點? 在xml中執行它更容易。在構建過程中可以包含/排除帶有不同配置的XML文件。 >>您從Spring獲得這些豆子的具體好處是什麼? 輕鬆創建具有不同依賴關係的不同bean實例。 – dsatish

1

在CDI中,您可以使用Qualifer來識別提供該實例的不同實例和生產者方法。

public class ControllerFactory { 

    @Produces 
    @StrategyA 
    public Controller createControllerA { 
     return new Controller(configA); 
    } 

    @Produces 
    @StrategyB 
    public Controller createControllerB { 
     return new Controller(configB); 
    } 
} 

@StrategyB 
@Inject 
Controller howToAccessIt; 

如果你不喜歡創建新的StrategyA/B/C註釋每個策略,你可以使用一個註解與識別策略的字段(例如枚舉)。所以你可以寫:@Strategy(StratType.A)

然後你就可以在你的生產方法使用InjectionPoint,這樣就可以根據在一個通用的方法註釋創建實例,而不是寫一個新的製作方法,爲每個戰略:

@Produces 
//must add a Annotation to clarify that this producer produces for all Strategies! 
public Controller createController(InjetionPoint ip) { 
    Annotated annotated = ip.getAnnotated(); 
    if (annotated.isAnnotationPresent(Strategy.class)) { 
     Strategy stragtegyAnnotation = (Strategy) annotated.getAnnotation(Strategy.class); 
     switch(stragtegyAnnotation.value) { 
      case A: return new Controller(configA); 
      ... 
     } 
    } 
} 
+0

可能最簡單的解決方案是使用'@Named()'限定詞和生產者字段。 – irreputable

1

所以,我對EE6批註並不十分熟悉,但是我在一個問題中使用純Spring註釋解決了類似的問題,我的問題是asked and then answered myself。這不完全相同,因爲它只創建一次實例,但將所有不同的依賴注入到一個Map中。基本上,它將允許切換基於配置標誌的實現,但不是一次實例化所有的實現。

+0

感謝您的評論 - 您的問題和解決方案很有趣(我的問題雖然有點不同) – dsatish