CDIコンテナイベントの分類

CDIコンテナのライフサイクルイベントを表1にまとめてみました。

私はこれらのイベントはフェーズや用途によって以下のグループに分けられると思います(今後、CDIを使いこなしていくうちにもっと用途を細かく追記できるでしょうが、まずはここからスタートします)。

A) コンテナのライフサイクルフェーズごとに送信されるもの

A-1) コンテナへの各種情報の登録

  • BeforeBeanDiscovery
  • AfterBeanDiscovery

A-2) 拡張モジュールの初期化と終了処理

  • AfterDeploymentValidation
  • BeforeShutdown

B) コンテナがアーカイブ内のBeanをスキャン中に送信されるもの

B-1) コンテナが管理するメタモデルを置き換え/上書きする

  • ProcessAnnotatedType
  • ProcessInjectionTarget

B-2) スキャン中にBeanの情報を収集する

  • ProcessBean
  • ProcessObserverMethod
  • ProcessProducer

AグループはJSFのリクエストライフサイクルとも似ていて、コンテナからのコールバックと考えると直感的にはわかりやすいと思います。A-1では、Beanに指定するアノテーションを追加したり(BeforeBeanDiscovery)、アーカイブ外部のクラスをCDIのBeanとして登録したり、新規コンテキストを登録する(AfterBeanDiscovery)ことが可能です。

BグループはコンテナがBeanをスキャンするときに送信されるものです。B-1はコンテナの挙動をカスタマイズするためにメタモデルを再定義するためのものです。B-2はBeanのスキャンごとにBeanの種類毎に送信されるイベントで、このイベントを受信することでBeanの形式をチェックしてデプロイエラーにしたり、Beanの情報を収集したりできます。

次回以降は個々のCDIイベントを使いながら用途や応用を考えていきます。

表1:CDI 1.0 ライフサイクルイベント
イベント 説明
BeforeBeanDiscovery このイベントタイプはBeanのディスカバリプロセスが開始する前にコンテナによってスローされます。
AfterBeanDiscovery このイベントタイプはBeanのディスカバリプロセスが完了し、発見されたBeanに関連した定義エラーが一つも無く、発見されたBeanのためのBeanとObserverMethodオブジェクトが登録されたときにコンテナによってスローされます。そして、その後、コンテナはデプロイの問題を検出します。
AfterDeploymentValidation このイベントタイプはデプロイの問題が一つもないことが検証された後にコンテナによってスローされます。その後、コンテキストを作成したり、リクエストの処理に入ります。
BeforeShutdown このイベントタイプはリクエストの処理を終了し、すべてのコンテキストを破壊した後に発火します。
ProcessAnnotatedType コンテナはBeanアーカイブ内で発見したJavaクラスまたはインタフェースのためにこのタイプのイベントを発火し、その後、宣言されたアノテーションを読みます。
ProcessInjectionTarget コンテナは、コンテナによって実行時に生成可能なインジェクションをサポートする各Java EEコンポーネントクラスのためにこのタイプのイベントを発火します。javax.annotation.ManagedBeanを使って定義された管理Bean、EJBセッション、メッセージ駆動Bean、使用可能なBean、使用可能なインターセプタ、使用可能なデコレーターを含みます。
ProcessBean コンテナはBeanアーカイブ内にデプロイされた使用可能なBean、インターセプター、デコレーターのためにこのタイプのイベントを発火します。使用可能な管理Beanに対してのみ発火するProcessManagedBean、使用可能なセッションBeanに対してのみ発火するProcessSessionBeanもあります。
ProcessObserverMethod コンテナは使用可能なBeanのオブザーバーメソッドのためにこのタイプのイベントを発火し、その後、そのオブザーバーメソッドオブジェクトを登録します。
ProcessProducer コンテナは、リソースを含むそれぞれの使用可能なBeanのプロデューサーメソッドまたはメソッドのためにこのタイプのメソッドを発火します。使用可能なプロデューサーメソッドに対してのみ発火するProcessProducerMethodや使用可能なプロデューサフィールドに対してのみ発火するProcessProducerFieldがあります。
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。