Seam3の概要

2011年3月3日(木)
皆本 房幸

Java EE 6とCDI

JBoss.orgより2010年12月にオープンソースJava EE 6アプリケーションサーバーJBossAS 6.0.0.Finalがリリースされました。Java EE 6にはJSR-299 CDI (Context and Dependency Injection)仕様が含まれており、JBossAS 6にCDI参照実装Weldが含まれているので、JBossAS でもCDIを試せるようになりました。

SeamFramework.orgでは、このCDIをベースとした次世代アプリケーションフレームワークSeam3をオープンソースで開発しています。Seam3はCDI仕様の上に構築された拡張モジュール群で、Servlet, JSF, EJB, JPA, JMS等の既存Java EE APIの上に、従来よりも抽象度が高く、使いやすい機能群を提供します。

このSeam3のリリースが目前(本稿執筆時点では2011年3月がリリース予定です)となってきたことで、そろそろJava EE 6をターゲットとしたアプリケーション開発について具体的な検討を開始しても良い時期になってきたと思います。本連載では4回に亘って、CDIの基本からSeam3の概要について、プログラム例を交えながら解説します。

JSR-299 CDIとは

JSR-299の名称はContexts and Dependency Injection for Java EEで、文字通り、Java EE向けのコンテキストと依存性注入の仕様になります。DIについては、Spring FrameworkをはじめとしてJavaの世界ではかなり一般的に使われているので特に新しい感じは受けないかと思いますが、実はDIを「コンテキスト」と組み合わせたというところにCDIの肝の部分があります。

コンテキストはサーバー上に保持される、実行中の処理の状態です。コンテキストの種類によってコンテキストの寿命の長さは異なります。例えば、RequestコンテキストはHTTPリクエストの処理用のコンテキストですし、SessionコンテキストはHttpSessionを表すセッションのコンテキストです。コンテキストはアクセス範囲も示しています。Sessionコンテキストは別のユーザーからはアクセスできません。

コンテキストは「スコープ」という概念を実現する手段になります。CDIでは、Javaクラスにはそのインスタンスがどの種類のスコープによって管理されるかというJavaアノテーションをJavaクラス定義に付加することができます。CDIのスコープ(コンテキスト)の種類は、サーブレット仕様で定義されている、Request, Session, Applicationに加えて、Conversationというアプリケーションがその境界を定めることができるものもあります。

アノテーション 説明
@RequestScoped 単一リクエストに対応するスコープ
@ConversationScoped 複数リクエストに対応するスコープ
@SessionScoped HttpSessionに対応するスコープ
@ApplicationScoped アプリケーションが起動している間のスコープ
@Dependent 他と共有しないスコープ。インジェクションの対象となるインスタンスのライフサイクルに関連付けられる
図1:CDIスコープアノテーション

CDIでは、他のDIフレームワークと同様にインジェクションのタイミングでインスタンスが生成されます。一方、他のDIとの違いは、このインスタンスはコンテキスト上で管理されるという点です。コンテキストには始まりと終わりがあります。コンテキストの寿命が終えるとき、それが管理するインスタンスも一緒に解放されます。これをコンテキストによるライフサイクル管理と言います。

レッドハット株式会社

JBoss コンサルタント。日本 JBoss ユーザ・グループ(www.jbug.jp)発起人、翻訳プロジェクトリーダ。 著書『JBoss入門』『JBoss徹底活用ガイド』(共著)他。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています