【動作環境】
Eclipse3.1.1
Seasar2.3.4
J2SE SDK5.0update5
1. はじめに
「システム構築の現場にもっと『易しさ』と『優しさ』を」
Seasar2は、こんな願いが込められた、Seasarファウンデーションによって開発が進められているAOP機能を備えたDIコンテナです。
本稿では、ホントに『易しさ』と『優しさ』が得られるのかな?という期待を込めて、0からSeasar2を用いて簡単なWebアプリケーションを作成するまでに行なったことをご紹介します。
この記事は、JavaでWebアプリケーションは作ったことがあり、Seasar2にも興味がある、という方を対象にしています。(この原稿を書きはじめる前の筆者のような人)
そして、Seasar2の細かいところまで理解するというよりも、Seasar2をWebアプリケーション開発で利用するきっかけを掴んでいただければと思っています。
2. DIコンテナ/AOPとは?
DIコンテナやAOPは、最近とてもよく目にするキーワードです。Seasar2の紹介に先立ち、簡単にその概要とメリットを紹介しておきます。
2.1. DIコンテナ
DIコンテナの役割として、まず上げられるのは、「コンポーネント間の依存関係を小さくする」ことです。(コンポーネントはある機能を提供するクラス(群)を指します。)
コンポーネントが二つあり、あるコンポーネントAがもう一方のコンポーネントBを利用しているとします。2つのコンポーネントの依存関係が大きければ、Bが完成していない状態では、Aの動作確認が全く出来なかったり、Bへの変更によって、Aが大きく影響を受けたりしてしまいます。
例えば、サーブレットコンテナとサーブレットの関係でも、サーブレットコンテナは大きくサーブレットに依存しており、サーブレットコンテナが無い状態では動かしてみることができません。
DIコンテナを用いると、「ソースコード中では、コンポーネント間の依存関係は小さく記述」しておき、DIコンテナによって、「実行時にコンポーネント間の依存関係を挿入する」ことができるようになります。
結果、以下のようなメリットが得られます。
- コンポーネント単位でのテストがしやすくなる
- 他のコンポーネントに対して変更による影響が及びにくくなり、変更に強くなる
- コンポーネントの独立性が高まることにより、再利用性が高くなる
2.2. AOP(Aspect Oriented Programming)
AOP(アスペクト指向プログラミングは、OOP(オブジェクト指向プログラミング)の延長にあるものです。
オブジェクト指向プログラミングは、人間の認識している概念を、プログラミングの中でも、そのままの形でオブジェクトとして表現しようとするプログラミング手法です。
オブジェクト指向では、システムを実現するための役割を、各オブジェクトに振り分けていきます。
その際、クラス定義の中にオブジェクトが持つべき本質的な役割ではなく、しかも複数のクラスに必要とされる役割が入りこんでしまうことがあります。典型的なものが、ロギング処理や、データベースアクセスにおけるトランザクション処理などです。このような役割は「横断的な関心事」と呼ばれます。
アスペクト指向プログラミングでは、このような「横断的な関心事」を分離して、各クラスには本質的な役割のみを記述させます。そして、AOP処理系がオブジェクトと横断的な関心毎の結びつけ(織り込み)を行ないます。
この横断的な関心毎を実装したコードは、「Advice」もしくは「Interceptor」と呼ばれます。
下図は、AOP処理系によってビジネスロジックを実装したオブジェクトに、ロギングを行なうInterceptorを織り込んだ例です。ビジネスロジックだけが書かれたオブジェクトに、AOP処理系によってロギング処理を織り込んでいます。

ロギング処理は、ビジネスロジックの処理(メソッド)の最初と最後に織り込まれています。この、織り込む場所のことを「
pointcut」といいます。
AOPを行なうことで、以下のようなメリットが得られます。
- クラス定義にオブジェクトの本質的な役割の記述のみ記述されるため、プログラムがシンプルで分かりやすくなる
- 横断的な関心事が分離され、まとめて管理できるため再利用性、変更への耐性が高くなる
※AOPについては、以下の原稿もよろしければ参考にしてみてください。
初めてのAspect指向プログラミング
http://www.stackasterisk.jp/tech/java/aspect01_01.jsp