Seasar2 S2AOPについて
ページ 目次
- AOPとは
- Seasar2にてS2AOPを使ってみる
1.AOPとは
AOPとはAspect Oriented Program:アスペクト指向プログラムの略です。
概念的には本来のオブジェクトと責務とそうではない役割を分けて、そうではない役割を担当してもらうって感じですね。
よく例として出されるのはログの出力が出されると思います。
細かい概念はおいておいて、実際にはどんなときに使ったりするのかを見てみたいと思います。
Seasar2ではS2AOPという形で対応されています。
2.Seasar2にてAOPを使ってみる
早速S2AOPを用いてログを出力するためのサンプルを作成してみましょう。
ここで出力されるのは対象のコンポーネントのメソッドを呼び出したときのログになります。
使用するための手順で確認をしてみたいと思います。
- ログ出力対象の作成
- 設定ファイルの準備
- ログの出力を確認
1.ログ出力対象の作成
S2AOPはメソッド単位でアスペクトをかけることができます。
そこで簡単なサンプルを作成してみたいと思います。
まずはAOPをかけていない状態で動作するものを作成します。
作成するファイルは以下のようになります。
パッケージ名 | クラス名 | 説明 |
---|---|---|
sample.aop | AopLogSampleMain.java | サンプルのメインクラス |
sample.aop | AopLogSampleService.java | サンプルクラスから使用されるインターフェース |
sample.aop | AopLogSampleServiceImpl.java | サンプルクラスから使用される実装クラス |
sample.aop | aop_sample.dicon | 設定ファイル |
AopLogSampleMain.java
package sample.aop; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; /** * AopをかけたServiceクラスを呼び出すMainクラス。 */ public class AopLogSampleMain { // 設定ファイルのPath private static final String PATH = "sample/aop/aop_sample.dicon"; /** * メインクラス。 * @param args */ public static void main(String[] args) { // 設定ファイルを読み込む. SingletonS2ContainerFactory.setConfigPath(PATH); // 初期化する. SingletonS2ContainerFactory.init(); // コンテナを取得する. S2Container container = SingletonS2ContainerFactory.getContainer(); AopLogSampleService alss = (AopLogSampleService) container .getComponent(AopLogSampleService.class); alss.aopLogSampleCheck(0); // 使用したコンポーネントを廃棄する. container.destroy(); } }
AopLogSampleService.java
package sample.aop; /** * Aopの対象のコンポーネント */ public interface AopLogSampleService { /** * サンプルチェック. * @param arg 引数 * @return 戻り値 * */ public boolean aopLogSampleCheck(int arg); }
AopLogSampleServiceImpl.java
package sample.aop; import org.apache.log4j.Logger; /** * Aopの対象のコンポーネント */ public class AopLogSampleServiceImpl implements AopLogSampleService { /** * サンプルチェック. * @param arg 引数 * @return 戻り値 * */ public boolean aopLogSampleCheck(int arg) { System.out.println("サンプルメソッドの開始"); if (arg == 0) { return true; } else { return false; } } }
aop_sample.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <!-- AOPログのコンポーネントの登録 --> <component name="AopLogSampleService" class="sample.aop.AopLogSampleServiceImpl"/> </components>
まずAOPをかけない状態で実行してみたいと思います。
DEBUG S2Containerを作成します。path=sample/aop/aop_sample.dicon DEBUG S2Containerを作成しました。path=sample/aop/aop_sample.dicon INFO Running on [ENV]product, [DEPLOY MODE]Normal Mode サンプルメソッドの開始
正常に実行されました。
しかしコンポーネントが実行されたかどうかログに出力されていないので、実行されているかどうかわかりません。
次にS2AOPをかけてメソッドの実行ログを出力するようにしたいと思います。
S2AOPではアスペクトを組み込む対象のクラスに直接手を加えることなく対応できます。
編集するファイルは次のものになります。
aop_sample.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <!-- ログ出力用のコンポーネント --> <component name="traceInterceptor" class="org.seasar.framework.aop.interceptors.TraceInterceptor"/> <!-- AOPログのコンポーネントの登録 --> <component name="AopLogSampleService" class="sample.aop.AopLogSampleServiceImpl"> <aspect>traceInterceptor</aspect> </component> </components>
aop_sample.diconに以下の部分が追加されています。
<!-- ログ出力用のコンポーネント --> <component name="traceInterceptor" class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
<aspect>traceInterceptor</aspect>
まず一つ目のtraceInterceptorを追加している部分ですが、S2AOPではあらかじめいくつかのインターセプターが用意されており
その一つであるtraceInterceptorを組み込んでいます。
traceInterceptorは適用したメソッドの処理前と処理後にログを出力することができます。
では早速実行してみたいと思います。
DEBUG S2Containerを作成します。path=sample/aop/aop_sample.dicon DEBUG S2Containerを作成しました。path=sample/aop/aop_sample.dicon INFO Running on [ENV]product, [DEPLOY MODE]Normal Mode DEBUG BEGIN sample.aop.AopLogSampleServiceImpl#aopLogSampleCheck(0) サンプルメソッドの開始 DEBUG END sample.aop.AopLogSampleServiceImpl#aopLogSampleCheck(0) : true
設定ファイルにS2AOPの設定を記載する前の実行結果から以下の2行が増えています。
この部分がtraceInterceptorによって追加された部分になります。
まず
DEBUG BEGIN sample.aop.AopLogSampleServiceImpl#aopLogSampleCheck(0)
の部分にて対象のメソッドが呼び出されたときのログが出力されます。
(0)となっている部分はメソッドの引数の値になります。今回は引数としてint型の0を値として渡しているで(0)と表示されています。
次に、
DEBUG END sample.aop.AopLogSampleServiceImpl#aopLogSampleCheck(0) : true
の部分にてメソッドの呼び出し後のログが表示されています。
: の後に表示されているtrueはaopLogSampleCheckの戻り値になります。
Seasar2 Topに戻る