2012年5月2日水曜日

seasar2 AOP

seasar2を使った、簡単なAOPのサンプルです。
seasar2に用意されているorg.seasar.framework.aop.interceptors.TraceInterceptorをアドバイス(インターセプタ)としてそのまま利用しています。
org.seasar.framework.aop.interceptors.TraceInterceptorは、ポイントカットとなるメソッドの前後にメソッド名や引数、戻り値をコンソールに出力してくれるアドバイス(インターセプタ)です。

今回のサンプルでは、log4jは使用していません。
log4jのjarは、クラスパスに置いていないので、 自動でjava.util.logging.Loggerが使用されます。

org.seasar.framework.aop.interceptors.TraceInterceptorはデバッグレベルでログを出力します。
java.util.logging.LoggerのログレベルはFINEにしておいてください。
参考URL:http://www.alles.or.jp/~torutk/oojava/maneuver/2001/logging/logging.html

(1)パッケージ構成




(2)ソース
Driver.java package org.yama.study.aop.pk1;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class Driver {
    public static void main(String[] args) {
        SingletonS2ContainerFactory.init();
        S2Container container = SingletonS2ContainerFactory.getContainer();
        ClassAImpl ca = (ClassAImpl) container.getComponent("classA");
        ca.methodA();
        ca.methodB();
    }
}

ClassAImpl.java package org.yama.study.aop.pk1;

public class ClassAImpl {
    public void methodA() {
        System.out.println("Hello Aop from methodA!");
    }
    public void methodB() {
        System.out.println("Hello Aop from methodB!");
    }
}

app.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" />

    <component name="classA" class="org.yama.study.aop.pk1.ClassAImpl">
      <aspect>traceInterceptor</aspect>
    </component>
</components>

main()を実行すると以下の実行結果が得られます。
実行結果 (以下の出力以外に、seasar2本体のログが出力される場合もありますがテーマに関係ないので削除しました。)

普通: BEGIN org.yama.study.aop.pk1.ClassAImpl#methodA()
Hello Aop from methodA!
5 02, 2012 3:11:35 午後 org.seasar.framework.log.Logger debug
普通: END org.yama.study.aop.pk1.ClassAImpl#methodA() : null
5 02, 2012 3:11:35 午後 org.seasar.framework.log.Logger debug
普通: BEGIN org.yama.study.aop.pk1.ClassAImpl#methodB()
Hello Aop from methodB!
5 02, 2012 3:11:35 午後 org.seasar.framework.log.Logger debug
普通: END org.yama.study.aop.pk1.ClassAImpl#methodB() : null

メソッドの前後にログが出力されています。

続いてapp.diconを以下のように変更してみます。
app.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" />

    <component name="classA" class="org.yama.study.aop.pk1.ClassAImpl">
    <aspect pointcut="methodA">traceInterceptor</aspect>
    </component>
</components>

「<aspect pointcut="methodA">traceInterceptor</aspect>」の部分を修正しています。

すると、methodAの前後にだけアドバイスが織り込まれている(ウィービングされている)ことがわかります。

実行結果 (以下の出力以外に、seasar2本体のログが出力される場合もありますがテーマに関係ないので削除しました。)

5 02, 2012 3:42:14 午後 org.seasar.framework.log.Logger debug
普通: BEGIN org.yama.study.aop.pk1.ClassAImpl#methodA()
Hello Aop from methodA!
5 02, 2012 3:42:14 午後 org.seasar.framework.log.Logger debug
普通: END org.yama.study.aop.pk1.ClassAImpl#methodA() : null
Hello Aop from methodB!


0 件のコメント:

コメントを投稿