読者です 読者をやめる 読者になる 読者になる

liguofeng29’s blog

個人勉強用ブログだっす。

S2AOPとは

 AOPAspect oriented Programming(アスペクト指向プログラミング)である。

 

なにができるを簡単を説明すると
複数メソッドの前後同じ処理(ログ出力とか)を適用できる。

 

Seasar2ではS2AOPという、S2Containerで管理するコンポーネントに対してAOP適用する機能がある。

※ finalクラスには適用できない

※ finalメソッド、staticメソッド、非publicメソッドにはAOP適用できない

 

aop.diconにデフォルト登録されているTraceInterceoporを適用してみる。

 

app.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 
<components>
 
  <include path="convention.dicon"/>
  <include path="aop.dicon"/>
 
  <component name="traceAopTest" class="aop.TraceAopTest">
    <!-- getMessage1とgetMessage2に対して、traceInterceptorを適用する -->
    <!-- traceInterceptorはaop.diconに登録されている -->
    <aspect pointcut="getMessage1,getMessage2">aop.traceInterceptor</aspect>
  </component>
</components>

 

TraceAopTest.java
package aop;
public class TraceAopTest  {
    public String getMessage1() {
        return "メッセージ1";
    }
 
    public String getMessage2() {
        return "メッセージ2";
    }
 
    public String getMessage3() {
        return "メッセージ3";
    }
}
 
TestAopMain.java
package aop;
 
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
 
public class TestAopMain {
 
    public static void main(String[] args) {
 
        // S2Container初期化
        SingletonS2ContainerFactory.init();
 
        // コンポーネント取得
        TraceAopTest t = SingletonS2Container.getComponent(TraceAopTest.class);
        t.getMessage1();
        t.getMessage2();
        t.getMessage3();
 
        // S2Container破棄
        SingletonS2ContainerFactory.destroy();
    }
}
 
出力メッセージ
2015-08-07 17:56:46,537 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN aop.TraceAopTest#getMessage1()
2015-08-07 17:56:46,537 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - END aop.TraceAopTest#getMessage1() : メッセージ1
2015-08-07 17:56:46,537 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN aop.TraceAopTest#getMessage2()
2015-08-07 17:56:46,537 [main] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - END aop.TraceAopTest#getMessage2() : メッセージ2

メソッドの前後にトレースログが自動的に追加されている!!