JSR 299: Web Beans
Java EEプラットフォームでは、ビュー層およびコントローラ層のためのAPIとしてJSF(JavaServer Faces)を、ビジネス層のためのAPIとしてEJB3が用意されている。しかし両者で定義されたコンポーネントモデル、すなわちJSFのManaged BeanとEJB3のSession Beanとは互換性がないため、両者を同時に使用する場合には2種類のコンポーネントを同時に管理しなければならない。
JSR 299で標準化を目指しているWeb Beansは、JSFとEJB3双方に互換性のある統一したコンポーネントモデルを定義することで上記の問題を解決しようというものである。同時に、対話モデルや永続性コンテキスト管理などを提供することで、JSFとJPA(Java Persistence API)間の状態管理やトランザクション管理などの問題解決を図る。
JSR 299のスペックリードはJBoss SeamのリードであるGavin King氏が務めている。もともとWeb BenasのコンポーネントモデルはJBoss Seamをもとにして考案されたものだ。JSR 299は現在Early Draftが公開されている。最終的にはJava EE 6に含まれる予定となっている。
Web Beansのコンポーネントモデル
JSR 299では、Java EE環境における統一されたコンポーネントモデルとして「Web Beanコンポーネント」を定義しているこのモデルの定義が、Web Beans仕様そのものと言ってもいい。Web BeansはJSFとEJB3双方と互換性があるが、Web BeanがEJBそのものである必要なないという。つまり、Web BeanはEJBに定められたすべての機能を提供する必要はなく、"EJBではないWeb Bean"も定義できるということだ(当然、EJBとして宣言することもできる)。また、Web BeanはJava EE環境の外でも実行可能であるべきだとしている。
Web Beanコンポーネントはアプリケーションの状態やロジックを管理する。この点はManaged BeanやSession Beanと同様である。ドラフトによれば、Web Beanコンポーネントは次のような内容から構成されるとなっている。
- コンポーネントタイプ
- 実装クラスかプロデューサ・メソッドのどちらか
- APIタイプのセット
- バインディングアノテーションタイプのセット(空でも可)
- スコープ
- コンポーネント名
Web BeanはWeb Beansコンテナによって生成される。Web Beansコンテナは次のような機能を持つ。
- 特定のWeb Beansコンテキストへのライフサイクルおよびスコープ管理
- クライアントへのインジェクト時におけるタイプおよびバインディングアノテーションタイプによるスコープ解決
- Unified EL使用時における名前によるスコープ解決
- インジェクションやUnified EL使用時における自動インスタンス化
- 他のWeb Beanの自動インジェクション
- ライフサイクルコールバック
- メソッドやライフサイクルのインターセプション
- イベント通知
King氏は、ほとんどのWeb Beanコンポーネントは"Stateful"でかつ"Contextual(コンテキスト依存)"であると述べている。すなわち、クライアントのコンポーネントの状態はそのクライアントが参照するインスタンスによって異なる。しかしながらインスタンスのライフサイクルはコンテキストによって管理され、クライアントが制御することはできない。
コンテキストはWeb Beansコンテナと強力してWeb Beanコンポーネントのインスタンスの生成や削除を行う。ただし実際に生成・削除を実行するメカニズムはコンポーネントの種類によって異なるという。例えばWeb BeanコンポーネントがEJBセッションBeanの場合はコンテナはEJBコンテナからインスタンスを取得し、プロデューサメソッドコンポーネント(後述)ならばプロデューサメソッドを呼び出すことでインスタンスを取得する。
このモデルはJBoss Seamで採用されたコンポーネントモデルの考え方をもとに発展させたもので、コンポーネントどうしの結合が疎になるというメリットがあるという。次回は、Web Beanコンポーネントを構成する各要素や、その定義方法などについてもう少し詳しく見ていこうと思う。