TOP比較データ> 宣言トランザクション管理
徹底比較!!DIxAOPコンテナ
DIxAOPコンテナ「Seasar2とSpring」

第3回:Seasar2の導入によるDIの実現
著者:豆蔵  長谷川 裕一、竹端 進   2005/11/16
前のページ  1  2   3  4  次のページ
宣言トランザクション管理

   さらに、EmployeeManagerImplを見ていくとcommitやrollbackなどのトランザクションを管理している部分が消えていることがわかると思います。

   ソースコードに明示的にコーディングしていたトランザクション管理をSeasar2に移して、宣言的なトランザクション管理を行っているからです。
TransactionManagerの設定

   リスト5はサンプルのコンポーネント定義"j2ee.dicon"から抜粋した、トランザクション管理機能を持つTransactionManagerの設定部分です。

リスト5:TransactionManagerの設定
<component name="transactionManager"
      class="org.seasar.extension.jta.TransactionManagerImpl"/>     (1)
   <component name="requiredTx"
      class="org.seasar.extension.tx.RequiredInterceptor"/>
(中略)
   <component name="xaDataSource"
      class="org.seasar.extension.dbcp.impl.XADataSourceImpl">      (2)
      <property name="driverClassName">
         "org.hsqldb.jdbcDriver"
      </property>
      <property name="URL">
         "jdbc:hsqldb:hsql://localhost:9001"
      </property>
      <property name="user">"sa"</property>
      <property name="password">""</property>
   </component>

   <component name="connectionPool"
      class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">   (3)
      <property name="timeout">600</property>
      <property name="maxPoolSize">10</property>
      <property name="allowLocalTx">true</property>
      <destroyMethod name="close"/>
   </component>
   <component name="dataSource"
      class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>

リスト5は以下の3つの設定で構成されています。

TransactionManager自体の設定
リスト5の(1)はTransactionManagerおよび使用するトランザクションの属性ごとに用意されているコンポーネントの定義です。ここにはSeasar2で準備が終わっているコンポーネントがあらかじめ定義されています。

TransactionManagerが管理するDatasourceの設定
リスト5の(2)はSeasar2が提供するXADataSourceImplクラスを利用してDatasourceの設定を行っています。XADataSourceImplクラスは、指定された情報(ドライバークラス、URL、ユーザ、パスワード)にしたがってConnectionを作成します。

ConnectionPoolの設定
リスト5の(3)はSeasar2が提供するConnectionPoolImplクラスを利用してConnectionPoolの設定を行っています。ConnectionPoolクラスは、指定された情報(秒単位のタイムアウト値、同時アクティブコネクション数など)にしたがってConnectionを管理します。

表1:TransactionManagerの設定の構成


トランザクション管理の設定

   トランザクション管理を行うために、サンプルではSeasar2が提供するRequiredInterceptorクラスを使用しています。このクラスをAspectとして組み込むことでトランザクション機能を実現しています。

   リスト6は、サンプルの定義ファイル"app.dicon"から抜粋したトランザクション管理の設定部分です。"requiredTx"とは"j2ee.dicon"ファイルで定義されているコンポーネント名です。

リスト6:宣言的なトランザクションの設定
<component class="jp.co.thinkit.employee.business.EmployeeManagerImpl">
     <aspect>j2ee.requiredTx</aspect>
</component>

   クライアントがEmployeeManagerのメソッドを利用するごとに、Seasar2はAspectから呼び出されるTransactionManagerを使用してトランザクションを開始し、その後にEmployeeManagerImplの該当メソッドを呼び出します(リスト7)。メソッドの終了後は、同様にAspectから呼び出されるTransactionManagerを使用してトランザクションをコミットします。

リスト7:EmployeeManagerの呼び出し
employeeManager.addEmployee(emp);
現在のAADL

   さて、ここまでで今回のSeasar2を利用したEmployeeManagerImplと連載1回目のEmployeeManagerImplを比較してみましょう。

   インターフェースベース設計と宣言トランザクションを導入したEmployeeManagerImplがEmployeeDaoインターフェースの実装をまったく意識しないことがわかります。Seasar2を利用することでオブジェクトの管理(生成など)、構成(関連の設定など)処理をコンポーネントから排除することができています。つまりレイヤー間のコンポーネントの疎結合が実現でき、コンポーネント間が疎結合になったときの利点(表2)が享受できます。

メンテナンス性の向上
実装クラス同士の依存度が下がるため後からロジックを変更してもその影響範囲を極小化できます
品質の向上
モックを使って簡単にテストできるようになるためテスタビリティが向上します
開発期間の短縮
使いたい機能の実装ができあがってなくても実装・テストをおこなえるため並行して作業できるようになります
再利用性の向上
コンポーネントは通常のJavaのクラス(POJO)であり特定のAPI(EJBなど)に依存しないので再利用できる機会が増えます

表2:コンポーネント間の疎結合の実現による利点

   また、トランザクション管理をDIxAOPコンテナに移すことでEmployeeManagerImplは完全なPOJOとなり、各種のコンテナやJDBCなどのDBアクセス関連のオブジェクトにさえ依存していないことがわかります。よってメンテナンスや再利用性の向上が可能になり、新機能の追加が容易になっています。

   AADLの表3と見比べてみるとAADL2以上となりAADL3にほぼ合致することが確認できると思います。

AADL
表3:AADL(第1回、表4の再掲載)
(本連載では従来のものに少し手を加えたものになっています)
(画像をクリックすると別ウィンドウに拡大表示します)

前のページ  1  2   3  4  次のページ


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


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


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