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

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

   さらに、EmployeeManagerImplを見ていくと第1回目に提示したEmployeeManagerImplと異なり、commitやrollbackなどのトランザクションを管理している部分が消えていることもわかると思います。ソースコードに明示的にコーディングしていたトランザクション管理をSpringに移して宣言的なトランザクション管理を行っています。
トランザクションマネージャの設定

   リスト4はサンプルのBean定義から抜粋した、トランザクション管理機能をもつTransactionManagerの設定部分です。

リスト4:トランザクションマネージャの設定
リスト4:トランザクションマネージャの設定
(画像をクリックすると別ウィンドウに拡大表示します)

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

JDBCの設定
リスト4の(1)は外部に記述されているJDBCプロパティ(リスト5)を読込む設定です。
TransactionManagerが管理するDataSourceの設定
リスト4の(2)は、Springが提供するDriverManagerDataSourceクラスを利用してDataSourceの設定を行っています。DriverManagerDataSourceクラスは、リスト4の(2)で指定された情報(URL、ドライバークラス、ユーザ、パスワード)に従ってConnectionを作成します。
TransactionManager自体の設定
リスト4の(3)は、Springが提供するTransactionManagerとしてDataSourceTransactionManagerクラスを指定しています。

表3:リスト4の設定

リスト5:JDBCの設定
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost:9001
jdbc.username=sa
jdbc.password=
トランザクション管理の設定

   トランザクション管理を行うために、サンプルではSpringが提供するTransactionProxyクラスを使用しています。リスト6はサンプルの定義ファイルから抜粋したトランザクション管理の設定部分です。

リスト6:宣言的なトランザクションの設定
リスト6:宣言的なトランザクションの設定
(画像をクリックすると別ウィンドウに拡大表示します)

   リスト6は以下の設定を行っています。

  • リスト6の(1)employeeManagerという名前でSpringが提供するTransactionProxyを指定
  • リスト6の(2)TransactionProxyにTransactionManagerを指定
  • TransactionProxyにトランザクション境界をもつクラスとしてEmployeeManagerImplを指定
  • リスト6の(4)TransactionProxyにトランザクション境界となるメソッドとトランザクション属性を設定

表4:宣言的なトランザクションの設定

   リスト6の(2)のTransactionProxyの設定で、名前がemployeeManagerとなっていることに注目してください。EmployeeManagerを利用しているクライアント(リスト7)は、実はEmployeeImplをSpring(DIxAOPコンテナ)から取得しているのではなく、TransactionProxyを取得して利用しているのです。

リスト7:EmployeeManagerの呼出し
employeeManager.addEmployee(emp);
   クライアントからEmployeeManagerとして呼び出されたTransactionProxyは、クライアントがEmployeeManagerのメソッドを利用するごとに定義ファイルを参照し、リスト6の(4)でトランザクションの対象メソッドか否かを判定した後、リストの6の(2)で設定されたTransactionManagerを使用してトランザクションを開始し、リスト6の(3)で設定されたEmployeeManagerImplの該当メソッドを呼び出します。

   メソッドの終了後、TransactionProxyはTransactionManagerを使用してトランザクションをコミットします(図1)。

TransactionProxyを利用したトランザクション管理
図1:TransactionProxyを利用したトランザクション管理
(画像をクリックすると別ウィンドウに拡大図を表示します)


現在のAADL

   さて、ここまででSpringを利用したインターフェースベース設計と宣言トランザクションを導入したサンプルのEmployeeManagerImplと第1回目のEmployeeManagerImplと比較してみましょう。

   サンプルのEmployeeManagerImplがEmployeeDaoインターフェースの実装をまったく意識しないことがわかります。Springを利用することでオブジェクトの管理(生成など)、構成(関連の設定など)処理をコンポーネントから排除することができています。つまりレイヤー間のコンポーネントの疎結合が実現でき、コンポーネント間が疎結合になったときの利点が享受できます(第1回目:時代は今DIxAOPコンテナを参照)。

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

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

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

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


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


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


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