TOP比較データ> サンプルを用いたSeasar2によるAADL3への道
徹底比較!!DIxAOPコンテナ
DIxAOPコンテナ「Seasar2とSpring」

第3回:Seasar2の導入によるDIの実現
著者:豆蔵  長谷川 裕一、竹端 進   2005/11/16
1   2  3  4  次のページ
サンプルを用いたSeasar2によるAADL3への道

   前回は、Seasar2とSpringについての概要、ならびに各ソフトウェアの導入について説明しました。

   今回は、本連載の第1回に引き続きインターフェースベースの設計についてSeasar2を例にして解説します。

   それでは、第1回の最後に出てきた従業員管理WebアプリケーションにSeasar2を導入したもの(本連載の第2回でインストールした従業員管理Webアプリケーション。以下、サンプルと記述)を見てみましょう。Seasar2の定義ファイルについての詳細な解説は後ほど行います。
インターフェースベース設計

   サンプルコードではSeasar2を導入することによって、DIを利用する際にEmployeeManagerImplがEmployeeDaoインターフェースの実装を知らなくても済むようにしています。また、EmployeeManagerImplで明示的にコーディングしていたトランザクション管理(commitやrollback)をSeasar2の管理下に移すことで、宣言的なトランザクションを実現しています。

   ではそれぞれの定義ファイルとEmployeeManagerImplを順に見ていきましょう。

   まず、はじめにインターフェースベース設計を実現するための定義ファイル"employee.dicon"に、EmployeeManagerインターフェースを実装するEmployeeManagerImplとEmployeeDaoインターフェースを実装するEmployeeS2Daoが定義されています(リスト1)。両者の間の依存関係は記述されていませんが、これはSeasar2の自動バインディング機能を使用しているためです。

リスト1:コンポーネント定義(employee.dicon)
<component class="jp.co.thinkit.employee.dataaccess.s2dao.EmployeeS2Dao">
     <aspect>dao.interceptor</aspect>
</component>

<component class="jp.co.thinkit.employee.business.EmployeeManagerImpl">
     <aspect>j2ee.requiredTx</aspect>
</component>

   これに合わせEmployeeManagerImplでは、EmployeeDaoImplのインスタンスを作成している部分を削除し、Seasar2のセッタインジェクションを利用するためにEmployeeDaoインターフェースを格納するプロパティとセッタメソッドが追加されています(リスト2)。

リスト2:EmployeeManagerImplクラスの変更
public class EmployeeManagerImpl implements EmployeeManager {
     // 利用するDAO。S2によってインジェクションされる
     private EmployeeDao employeeDao;

     // DAO用のセッターインジェクション
     public void setEmployeeDao(EmployeeDao employeeDao) {
          this.employeeDao = employeeDao;
     }
(中略)
//EmployeeDao dao = new EmployeeDaoImpl();

   インターフェースベース設計をWebアプリケーションで実現するためには、"web.xml"にS2Containerを生成するクラスを設定する必要があります。今回はS2Strutsも使用しますので、Struts関連の定義も必要になります。リスト3は、"web.xml"の設定例の抜粋で、リスト4は"struts-config.xml"の定義例です。

   この設定によりWebアプリケーション起動時にSeasar2がオブジェクトの関連づけを行います。また起動したSeasar2はオブジェクトの関連づけをしてくれます。

   サンプルでは起動したSeasar2が定義ファイルを参照し、EmployeemanagerImplのセッタメソッドを利用してEmployeeDaoの実装クラスを設定してくれます。この機能により、Seasar2上で動作するPOJO(EmployeeManagerImpl)はインターフェース(EmployeeDao)の実装クラスを取得するためにSeasar2を意識する必要がないのです。

リスト3:web.xmlの設定例
<servlet>
     <servlet-name>s2container</servlet-name>
     <servlet-class>org.seasar.struts.servlet.S2StrutsServlet</servlet
-class>
     <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
     <servlet-name>action</servlet-name>
     <servlet-class>org.seasar.struts.servlet.S2ActionServlet</servlet
-class>
(中略)
     <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
     <servlet-name>s2container</servlet-name>
     <url-pattern>/EmployeeSeasar</url-pattern>
</servlet-mapping>
(省略)

リスト4:Strutsの設定
<!-- ========== Controller Configuration (S2Struts)================= -->
<controller processorClass="org.seasar.struts.processor.S2RequestProcessor"/>
(省略)
<!-- ========== Plug Ins Configuration (S2Struts)=================== -->
<plug-in className="org.seasar.struts.plugin.RegistActionClassPlugIn"/>

   ここまでが、Seasar2を利用したインターフェースベース設計になります。

   EmployeeManagerImplがEmployeeDaoインターフェースの実装を意識する必要がないこと、Seasar2上のPOJOがSeasar2を意識する必要がないことが理解していただけたかと思います。

1   2  3  4  次のページ


株式会社豆蔵 長谷川 裕一
著者プロフィール
株式会社豆蔵  長谷川 裕一
XMLの技術開発やCORBA、EJBを使用したシステム開発などを経て、現在はアジャイル開発プロセスの導入から工学的なソフトウエアプロセスの策定、オープンソースプロダクトに関するコンサルタント、アーキテクトとして常に第一線で活躍。共著として「プログラムの育てかた 現場で使えるリファクタリング(ソフトバンク)」、「Spring入門(技術評論社)」。


株式会社豆蔵 竹端 進
著者プロフィール
株式会社豆蔵  竹端 進
鉄鋼系SIerを経て現職に。現在はオープンソースプロダクトに関するコンサティング、開発支援、教育を行うチームに所属。日々、新たな技術をどのように生かしていくかを考える毎日。現在の注目対象はSeasar2とMaven。


INDEX
第3回:Seasar2の導入によるDIの実現
サンプルを用いたSeasar2によるAADL3への道
  宣言トランザクション管理
  Seasar2におけるDIの仕組みと設定方法
  トランザクションの設定