2011-06-29 7 views
3

私は、タイプがIStrategyのプロパティ戦略を持つクラスコントローラを持っているとします。春に、私は、コントローラの異なるインスタンスを作成し、以下に示すように、XML構成ファイルにBeanを定義することによって、異なる戦略の実装を注入することができる:異なる戦略を作成するための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> 

I次いで@Autowiredと@Qualifier(「strategyAController」)を使用してこれらのBeanを参照することができなどJava EE 6でこれを行うのと同等の方法は何ですか

答えて

4

面白いですよ! Java EE 6 CDIを設計したGavin Kingはまったく同じ問題で誰かと厄介な戦いに入った。

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

春のコードは、当然のことながら、Javaのようにひどく見えます。私たちはjavaでこれを行うことができます - いくつかの変数を作成し、いくつかのプロパティを設定します。私はあなたのperticularアプリケーションで、好奇心が強いです、プレーン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注釈を作成するために好きではない場合、あなたは戦略を特定のフィールド(例えば列挙型)で1つの注釈を使用することができます。あなたが書けるように:@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アノテーションに精通していませんが、私はasked and then answered myselfという質問で純粋なスプリングアノテーションを使用して同様の問題を解決しました。インスタンスには一度しか作成されませんが、すべての異なる依存関係がMapに挿入されているため、全く同じことではありません。基本的には、設定フラグに基づいて実装を切り替えることができますが、すべてを一度にインスタンス化することはできません。

+0

あなたのコメントのおかげで - あなたの問題と解決策は面白いです(私の問題は少し異なるですが) – dsatish

関連する問題