Seam3によるWebプログラミング
第1回でも説明したように、Seam3はCDI仕様の上に構築された新しいJava EEのフレームワークです。連載の最終回となる今回は、CDIプログラミング・モデルとSeam3の具体的なモジュールについて紹介します。
Seam3とは
Seamのミッションは「リッチで標準ベースのインターネット・アプリケーションを構築するための統合開発プラットフォームを提供すること」です。SeamFramework.orgでは現在、Seam2とSeam3を並行して開発しています。Seam2は2006年に登場したバージョン1.0と同じコンポーネント・モデルを引き継いだフレームワークですが、Seam3はアーキテクチャを刷新した久しぶりのメジャー・バージョン・アップとなります。
Seam2のプログラミング・モデルはJSR-299(CDI: Contexts and Dependency Injection)として提案され、仕様化されました。Seam3は、この標準仕様であるCDIをベースにした、拡張可能なJava EEアプリケーション開発のためのモジュール群です。
本稿執筆時、Seam3はリリースに向けた作業の真っ最中で、最終バージョンはまだ配布されていません。この記事で、現時点での最新版であるSeam 3.0.0.CR3をもとに説明を行います。Seam 3.0.0.CR3は、SeamFramework.orgのこのページからダウンロード可能です。
CDIプログラミング・モデル
Seam3のモジュールは、CDI仕様が定義するプログラミング・モデルの上に開発されています。これまでの連載記事では、CDIがコンテキストに基づいてBeanインスタンスを管理することと、タイプセーフなインジェクションについて説明してきました。実は、CDIはBean同士が連携できるような仕組みとして、インジェクションのほかにインタセプタやイベントという仕組みを持っています。
インタセプタとは、Beanのメソッド呼び出しに割り込んで実行される処理をモジュール化したものです。これを使うことにより、ロギングやセキュリティの検査など、さまざまな非機能要件の処理をBean定義に付加することが可能になります。デコレータは、メソッドの割り込みという意味ではインターセプタと同じですが、通常のビジネス・ロジックのメソッド定義と同じようなタイプセーフな定義ができます。
イベントとは、アプリケーションが定義したイベントを一斉同報的に送信し、それに興味があるBeanが受信するというものです(デザイン・パターンでのObserverパターンです)。CDIのイベントは、指定した型のイベントだけを受信できるのでタイプセーフです。CDIは、コンテキストによって積極的に状態を管理する仕様です。アプリケーション内部での状態変化を、それに関連するBeanに伝達するための手段をイベントという形で提供しています。
以上をまとめると、CDIのプログラミング・モデルは、次のように整理できます。
- コンテキストによるライフサイクル管理
- タイプセーフなインジェクション
- インタセプタ、デコレータ
- タイプセーフなイベント
上記のいずれも、型やアノテーションによってBean間で簡単に連携できる仕組みを提供しています。このプログラミング・モデルを使うことで、CDI上で連携できるBeanの集合体としてアプリケーションを定義できます。
CDI Portable Extensions
CDIは、Portable Extensionsと呼ばれる、CDI自身を拡張できるSPIを提供しています。これは、例えば、CDIコンテナの起動時に適用可能な、以下のような機能を提供します。
- コンテキストの追加
- Beanの登録
- Beanメタデータの操作
- アノテーション追加
- インタセプタ、デコレータの登録
- イベントの追加
これらの機能を使うことで、CDI仕様にはもともと存在しない新機能を提供する拡張モジュールを開発できます。それゆえ、CDIという仕様は、新しいフレームワークを作るためのフレームワークとも言えます。
拡張モジュールは、JARアーカイブの形式で提供します。アプリケーションが必要とする拡張モジュールをクラスパスに通しておくと、Webアーカイブのデプロイ時にCDIコンテナが認識します。