図1●従来のEJBコンテナと軽量コンテナ(DIコンテナ)の比較。従来はコンポーネントの依存関係をアプリケーション側が管理しなければならなかったのに対し,DIではコンテナが依存関係を管理する。また,DIではコンポーネントは通常のJavaオブジェクト(POJO)であるため,コンテナがなくても動作し,単体テストが容易というメリットがある
図1●従来のEJBコンテナと軽量コンテナ(DIコンテナ)の比較。従来はコンポーネントの依存関係をアプリケーション側が管理しなければならなかったのに対し,DIではコンテナが依存関係を管理する。また,DIではコンポーネントは通常のJavaオブジェクト(POJO)であるため,コンテナがなくても動作し,単体テストが容易というメリットがある
[画像のクリックで拡大表示]
表1●オープンソースの主な軽量コンテナ
表1●オープンソースの主な軽量コンテナ
[画像のクリックで拡大表示]
図2●Seasar2のサンプルを動作させるための手順。サンプルは,Windows 2000,J2SE 5.0,Tomcat 5.5.9,MySQL 4.1.7の環境で動作を確認した。なお,(3)の作業は,データベース連携アプリケーションのサンプルを利用する場合にのみ必要
図2●Seasar2のサンプルを動作させるための手順。サンプルは,Windows 2000,J2SE 5.0,Tomcat 5.5.9,MySQL 4.1.7の環境で動作を確認した。なお,(3)の作業は,データベース連携アプリケーションのサンプルを利用する場合にのみ必要
[画像のクリックで拡大表示]
表2●Seasar2の動作に必要なファイル
表2●Seasar2の動作に必要なファイル
[画像のクリックで拡大表示]
リスト1●Seasar2を利用するためにデプロイメント・ディスクリプタ(web.xml)に記述する内容
リスト1●Seasar2を利用するためにデプロイメント・ディスクリプタ(web.xml)に記述する内容
[画像のクリックで拡大表示]

 「サーバーサイドJavaプログラミングといえばEJB(Enterprise JavaBeans)」。そう思っている方はいませんか。なるほど,EJBはJ2EE(Java 2 Platform,Enterprise Edition)の中でトランザクション,セキュリティ管理,並列処理制御などを担っており,コア・コンポーネントとも言うべき存在です。EJB 2.0以降では,旧来の課題だったパフォーマンスも改善され,EJB採用の事例も次第に増えつつあります。

 しかし一方で,EJBにはいくつかの問題点があります。まず何と言っても,仕様が複雑で習得が難しいことです。さらに,動作させるためにEJB対応のコンテナが必要で,単体テストが難しいという問題点もあります。開発されたコンポーネントが特定のAPIに依存するため,再利用が困難である点を指摘する声もあがっています。

独立したオブジェクトを結びつける「接着剤」

 このような問題を改善した「軽量コンテナ」が,EJBの代替として最近注目されつつあります。軽量コンテナという名前は,複雑になりすぎたEJBと対比して「仕様が単純であり,習得も容易である」ことから来ています。その本質は「DI(Dependency Injection:依存性の注入)」という概念です。このため,DIコンテナと呼ばれることもあります*1

 「依存性の注入」という言葉は少しわかりにくいですね。平たく言うと「個々のコンポーネント(Javaクラス)にほかのコンポーネントとの依存関係を意識させない仕組み」です(図1[拡大表示])。DIではコンポーネント間の依存関係を,アプリケーションではなくDIコンテナが管理します。DIコンテナが,互いに独立したコンポーネントを結びつけて,最終的に一つのアプリケーションを組み立てるわけです。すなわち,コンポーネント間の依存関係をDIコンテナがアプリケーション外部から「注入」するのです。コンポーネント同士を貼り付ける「接着剤」の役割を果たすのがDIコンテナだと言ってもよいでしょう。

 DIコンテナを利用すると,コンポーネント同士はインタフェースだけで会話できるようになります。どの実装クラスをインタフェースに割り当てるのかという判定や,実装クラスの生成/初期化などの処理は,すべてDIコンテナが行ってくれます。どの実装クラスが必要なのかをコンポーネントに記述する必要はありません。DIコンテナが依存性を判断し,割り当ててくれるのです*2

 DIでは,個々のクラスを普通のJavaオブジェクトとして記述できるので,単体テストを行いやすいというメリットがあります。また,特定のAPIに依存しないので,再利用性も向上します。

 このようにサーブレットやEJBなど特定のプログラミング・インタフェースに依存しない普通のJavaオブジェクトを,特に「POJO(Plain Old Java Object)」と呼ぶことがあります。EJBコンポーネントのように特定のAPIに強く依存したオブジェクトと対比するために生み出された言葉で,最近では重要なキーワードになっています。

 今後,サーバーサイド・アプリケーションの開発では,「重量級」のEJBコンテナではなく,DIコンテナが採用される局面はますます増えてくるでしょう*3

純国産の軽量コンテナSeasar2を動かしてみる

 オープンソースで提供されている主な軽量コンテナには(表1[拡大表示])のようなものがあります。今回は,この中からSeasar2を取り上げます。

 Seasar2は,ひがやすを氏を中心に開発が進められている純国産の軽量コンテナです。必要な資料はすべて日本語で公開されています。JSF(JavaServer Faces)と連携するためのS2JSF,Strutsと連携するためのS2Struts,リッチ・クライアント対応のS2Flexなど多くの拡張機能が提供されており,様々な局面に適用できるのも大きな魅力です。

 それではまず,Seasar2が動作する環境を用意しましょう。JDK(Java Development Kit,http://java.sun.com/j2se/)とTomcat(http://jakarta.apache.org/tomcat/)をインストールしてください。今回のサンプルではデータベースを利用するため,MySQL(http://www.mysql.com/)とMySQL用のJDBCドライバであるConnector/Jもインストールする必要があります。サンプルの「nikkei200509.war」は,日経ソフトウエアのサイト(http://software.nikkeibp.co.jp/)からダウンロードできます。

 サンプルを動かすための簡単な手順を(図2[拡大表示])にまとめました*4。ソフトウエアのインストール方法とデータベース・アクセス用ユーザーの追加方法については,著者のサイト「サーバーサイド技術の学び舎- WINGS」(http://www.wings.msn.to/)の「サーバーサイド環境構築設定」を参照してください。Seasar2はサンプルの中に含まれているので,特にインストールする必要はありません。

 とはいえ,Seasar2を使ってアプリケーションを開発できるようになるためには,Tomcatへの組み込み方法を知っておくに越したことはありません。具体的には,2段階の手順を踏むことになります。

 まず,Seasar2の動作に必要なファイルをデプロイ(配置)します。Seasarプロジェクトのページ(http://www.seasar.org/)からSeasar2のアーカイブ「S2.x.x.zip(x.xはバージョン番号)」をダウンロードし解凍すると「seasar2」フォルダができます。各フォルダから,アプリケーション・ルート*5配下の各フォルダに必要なファイルを配置してください(表2)。

 (表2[拡大表示])で「基本」に分類したのは,Seasar2の基本機能を利用するために最低限必要なファイルです。これらのファイルは必ず配置する必要があります。一方,「拡張」に分類したファイルは,Seasar2の拡張機能(S2DataSet,S2DBCP,S2JDBC,S2JTA,S2Tx,S2Unit)を利用する場合にのみ必要なファイルです。

 次に,Seasar2の機能をTomcat上で有効にします。具体的には,Seasar2コンテナのインスタンスを管理するためのサーブレット「S2ContainerServletクラス」をJSP&サーブレット標準の設定ファイル「web.xml」(デプロイメント・ディスクリプタ)に登録します(リスト1[拡大表示])。

 この際,サーブレットの初期化パラメータconfigPathには,コンポーネント定義ファイルのパスを指定します(リスト1(1))。Seasar2では,このコンポーネント定義ファイルにより,コンポーネントのひも付けを行っています。

 初期化パラメータのdebugは,S2ContainerServletの再起動を許可するかどうかを決定するためのものです(リスト1(2))。debugをtrueに設定した場合,S2ContainerServletは「http://localhost:8080/nikkei200509/s2servlet?command=restart」で再起動できます。

 なお,Seasar2はアプリケーション内のほかのサーブレットに先立って有効化されている必要があります。必ず<load-on-startup>要素*6を「1」に設定してください(リスト1(3))。


山田 祥寛(やまだ よしひろ)

千葉県鎌ヶ谷市在住のフリーライター(http://www.wings.msn.to/