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

タスク概要:

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

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

@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;

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

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

例8.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 オブジェクトを挿入し、コードを動的に変更できます。