Contexts and Dependency Injection (CDI) と EJB コンテナーの統合
CDI 仕様は、コンテキスト・ライフサイクル管理を使用して EJB コンポーネント・モデルを強化します。
EJB 仕様と CDI の関係
EJB 仕様は、マルチユーザー環境でトランザクション・リソースにアクセスするアプリケーション・コンポーネントのプログラミング・モデルを定義します。実行時に EJB コンテナーで強制されるアノテーションおよび XML デプロイメント記述子を使用して、ロール・ベースのセキュリティー、トランザクション区分、並行性、スケーラビリティーなどの考慮事項を宣言的に指定します。EJB コンポーネントはステートフルの可能性がありますが、本質的にコンテキスト依存ではありません。
- コンテキスト
- ライフサイクル・コンテキストにバインド
- ライフサイクル・コンテキストで起動される他のインスタンスで使用可能
- コンテナーは必要に応じてインスタンスを作成
- コンテナーは、コンテキストが終了するとインスタンスを削除
WebSphere® Application Server traditional CDI コンテナーは、コンテキスト・インスタンスではないインスタンスでも、すべてのセッションおよびメッセージ駆動型 Bean インスタンスに対して依存関係注入を実行します。WebSphere Application Server CDI は、エンタープライズ Bean 内での CDI Bean の注入、および CDI Bean 内でのエンタープライズ Bean の注入をサポートします。
使用法

- ローカル・セッション Bean のコンテキスト注入の場合は、@Inject メソッドを使用します。
- リモート・セッション Bean の場合は、@EJB メソッドを使用します。
以下のように、非コンテキスト注入で EJB を使用可能にするプロデューサーを定義します。
@Produces @EJB PaymentService paymentService;
@Inject PaymentService myPaymentService
実行上の考慮事項
インターセプター・バインディングと装飾機能エンタープライズ Bean を使用して、CDI スタイルのインターセプターを定義できます。インターセプターは、@Interceptors メソッドを使用するか ejb-jar.xml ファイルで宣言されます (これらはインターセプターの前に呼び出されて、インターセプター・バインディングを使用して宣言されます)。インターセプターは、装飾機能の前に呼び出されます。有効範囲から出た結果、EJB コンテナーのコンテキスト @Injected インスタンスが破棄されたときに、アプリケーションによる remove メソッドの直接呼び出しを通じて、基礎となる EJB コンテナーがまだ除去されていなかった場合、WebSphere Application Server traditional CDI コンテナーはステートフル・セッション Bean を除去します。
- @Inject メソッドを使用してコンテキスト注入インスタンスを作成し、EJB コンテナー内のそのインスタンスが、スコープ外になった結果として破棄された場合。
- 基礎となる EJB コンテナーが、アプリケーションによる remove メソッドの直接呼び出しによってまだ削除されていなかった場合。
また、CDI Bean のスコープおよび状態の伝搬も考慮する必要があります。要求およびアプリケーションのスコープの CDI Bean は、Web コンテナーおよび EJB コンテナー全体で、それぞれのコンテキストで状態を保持します。例えば、ステートフル・セッション・エンタープライズ Bean のビジネス・メソッドが同じ要求スコープの Bean にアクセスする場合、サーブレットに注入されている要求スコープの CDI Bean はその状態を保持します。