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

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

   前回は、Seasar2を利用したインターフェースベースの設計について解説しましたが、今回はSpringを利用したインターフェースベースの設計とトランザクション管理を解説します。

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

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

   では、Spring用に新たに作成された定義ファイルと修正されたEmployeeManagerImplを見ていきましょう。

   まず、はじめに定義ファイルです。Springを利用したインターフェースベースの設計を実現するため、定義ファイルにEmployeeManagerとEmployeeDaoの依存関係が記述されています(リスト1)。

リスト1
<!-- Manager(Transaction Target) -->
   <bean id="employeeManagerTarget"
   class="jp.co.thinkit.employee.business.EmployeeManagerImpl">
      <property name="employeeDao">
         <ref local="employeeDao"/>
      </property>
   </bean>
<!-- DAO -->
   <bean id="employeeDao"
   class="jp.co.thinkit.employee.dataaccess.springjdbc.EmployeeDaoImpl">
      <property name="dataSource">
         <ref local="dataSource" />
      </property>
   </bean>

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

リスト2
public class EmployeeManagerImpl implements EmployeeManager {
     // 利用するDAO。Springによってインジェクションされる。
     private EmployeeDao employeeDao;
     // DAO用のセッタインジェクション
     public void setEmployeeDao(EmployeeDao employeeDao) {
          this.employeeDao = employeeDao;
     }
(中略)
//EmployeeDao dao = new EmployeeDaoImpl();

   SpringをWebアプリケーションとして動作させるためには、"web.xml"にBean定義ファイルとBean定義ファイルを読込むためのリスナ(ContextLoderListener)を設定する必要があります。リスト3はリスナの設定例です。

リスト3
<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/Bean定義ファイル.xml</param-value>
</context-param>
(中略)
<listener>
     <listener-class>
          org.springframework.web.context.ContextLoaderListener
     </listener-class>
</listener>
(以下略)

   上記の設定により、Webアプリケーションの起動時に自動的にリスナがSpringを起動させます。そして起動されたSpringはオブジェクトの関連づけをしてくれます。サンプルでは起動されたSpringが定義ファイルを参照し、EmployeemanagerImplのセッタメソッドを利用してEmployeeDaoの実装クラスを設定してくれます。この機能により、Spring上で動作するPOJO(EmployeeManagerImpl)はインターフェース(EmployeeDao)の実装クラスを取得するためにSpringを意識する必要がないのです。

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

   EmployeeManagerImplがEmployeeDaoインターフェースの実装を知らなくても済むようなっていること、Spring上のPOJOがSpringを意識する必要がないことが理解していただけたかと思います。

1   2  3  4  次のページ


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


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


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