9.2.6.2. プロデューサーメソッドの使用

概要

このタスクは、挿入用の Bean ではないさまざまなオブジェクトを生成するプロデューサーメソッドを使用する方法を示しています。

例9.10 代替の代わりにプロデューサーメソッドを使用してデプロイメント後のポリモーフィズムを可能にします。

例の @Preferred アノテーションは、修飾子アノテーションです。修飾子の詳細については、「修飾子について」を参照してください。
@SessionScoped
public class Preferences implements Serializable {
   private PaymentStrategyType paymentStrategy;
   ...
   @Produces @Preferred 
   public PaymentStrategy getPaymentStrategy() {
       switch (paymentStrategy) {
           case CREDIT_CARD: return new CreditCardPaymentStrategy();
           case CHECK: return new CheckPaymentStrategy();
           default: return null;
       } 
   }
}
以下の挿入ポイントは、プロデューサーメソッドと同じタイプおよび修飾子アノテーションを持つため、通常の CDI 挿入ルールを使用してプロデューサーメソッドに解決されます。プロデューサーメソッドは、この挿入ポイントを処理するインスタンスを取得するためにコンテナにより呼び出されます。
@Inject @Preferred PaymentStrategy paymentStrategy;

例9.11 プロデューサーメソッドへのスコープの割り当て

プロデューサーメソッドのデフォルトのスコープは @Dependent です。スコープを Bean に割り当てた場合、スコープは適切なコンテキストにバインドされます。この例のプロデューサーメソッドは、1 つのセッションあたり一度だけ呼び出されます。
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy() {
   ...
}

例9.12 プロデューサーメソッド内部での挿入の使用

アプリケーションにより直接インスタンス化されたオブジェクトは、依存関係挿入を利用できず、インターセプターを持ちません。ただし、プロデューサーメソッドへの依存関係挿入を使用して Bean インスタンスを取得できます。
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy(CreditCardPaymentStrategy ccps,
                                          CheckPaymentStrategy cps ) {
   switch (paymentStrategy) {
      case CREDIT_CARD: return ccps;
      case CHEQUE: return cps;
      default: return null;
   } 
}

要求スコープ Bean をセッションスコーププロデューサー挿入する場合は、プロデューサーメソッドにより、現在の要求スコープインスタンスがセッションスコープにプロモートされます。これは、適切な動作ではないため、プロデューサーメソッドをこのように使用する場合は注意してください。

注記

プロデューサーメソッドのスコープは、プロデューサーメソッドを宣言する Bean から継承されません。
結果

プロデューサーメソッドを使用して、非 Bean オブジェクトを挿入し、コードを動的に変更できます。