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とか、自前アノテーションの定義とかそんなんやります。