Aspect入門記その2 − アノテーション −


前回のようにAspectの定義をXMLで書くだけじゃなく、
アノテーションで書くこともできるようです。
用意されてるAdviceアノテーションは、以下のもんたちみたい。
 -@After → メソッドの直前に実行
 -@Before → メソッドの直後に実行
 -@Around → メソッドの直前直後に自由に実行。
        引数でAspectのクラスの渡されるJoinPointのproceed()で定義。
 -@AfterFinally → Finally句のあとに実行。
 -@AfterReturning → returnの後に実行。
 -@Mixin → これは次回^^;
 -他にもあるみたいだが、とりあえずショウリャク〜^o^


まずはこんな簡単クラスを用意。greetメソッド達にアスペクト
しかけてやります。


package org.shotd.dev.aop.aspectwerkz.sample2;

public class HelloWorld2 {

public void greet(){
System.out.println("Hello world2.");
}

public void greet2(){
System.out.println("Hello world2. - Around -");
}

public void greet3(){
try{
System.out.println("Hello world2. - After Finally -");
}finally{
System.out.println("finally");
}

}

public int greet4(){
System.out.println("Hello world2. - After Returning -");

return 0;
}

public static void main(String[] args){
HelloWorld2 greeter = new HelloWorld2();

greeter.greet();

System.out.println("");

greeter.greet2();

System.out.println("");

greeter.greet3();

System.out.println("");

greeter.greet4();

System.out.println("");
}
}


次にアスペクトのクラスを準備。
今のJDKは1.4なので、JavaDocコメントの中に記述します。
Tigerなら、当然通常のアノテーションで記述できますよ。
まあ、backport175と同じ感じですね。


うーむ、しかし@Before execution(* クラス名)とかって書いてしまうと
かなり汎用的には使えない気が。それは正規表現とかを駆使して書くのだろうか?
うーーーん(ーー;)、、、それはそれでどうだろう?
素直に設定ファイルに書くべきかなあ。


package org.shotd.dev.aop.aspectwerkz.sample2;

import org.codehaus.aspectwerkz.joinpoint.JoinPoint;

public class SimpleGreetAspectWithAnnotation {

/**
* @Before execution(* org.shotd.dev.aop.aspectwerkz.sample2.HelloWorld2.greet(..))
*/
public void beforeGreet(JoinPoint jp){
System.out.println("Before greeting......");
}

/**
* @After execution(* org.shotd.dev.aop.aspectwerkz.sample2.HelloWorld2.greet(..))
*/
public void afterGreet(JoinPoint jp){
System.out.println("After greeting......");
}

/**
* @Around execution(* org.shotd.dev.aop.aspectwerkz.sample2.HelloWorld2.greet2(..))
*/
public Object aroundGreet(JoinPoint jp) throws Throwable{
System.out.println("Around greeting......");

Object result = jp.proceed();
return result;
}

/**
* @AfterFinally execution(* org.shotd.dev.aop.aspectwerkz.sample2.HelloWorld2.greet3(..))
*/
public void afterFinallyGreet(JoinPoint jp){
System.out.println("AfterFinally greeting......");
}

/**
* @AfterReturning execution(* org.shotd.dev.aop.aspectwerkz.sample2.HelloWorld2.greet4(..))
*/
public void afterReturningGreet(JoinPoint jp){
System.out.println("AfterReturning greeting......");
Object obj = jp.getCallee();
}
}

とりあえず上のように書いてしまえば、あとは
aop.xml上では、ちょろっとアスペクトクラスを登録するだけ。








んで、実行〜


AspectWerkz - INFO - Pre-processor org.codehaus.aspectwerkz.transform.AspectWerkzPreProcessor loaded and initialized
Before greeting......
Hello world2.
After greeting......

Around greeting......
Hello world2. - Around -

Hello world2. - After Finally -
finally
AfterFinally greeting......

Hello world2. - After Returning -
AfterReturning greeting......


☆-(ノ゜Д゜)八(゜Д゜ )ノイエーイ

まあ、( ゜Д゜)⊃旦 オチツケー
今回は基本的なアノテーションを使って、簡単サンプルを
動かしてみました。


とりあえず超入門二回目はこんなもんでしょうかね。


次回は、アノテーション続きかな。
@Mixinとか、自前アノテーションの定義とかそんなんやります。