Hatena::ブログ(Diary)

チラシ裏日記上等!! このページをアンテナに追加 RSSフィード Twitter

2012-07-19

AspectJというものを触る

| 23:39 | AspectJというものを触るを含むブックマーク AspectJというものを触るのブックマークコメント

仕事でAspectJを使うことになったのでメモ。

AspectJ独自の構文を使ってアスペクトを作るのだけど、javaらしくない書き方というか、とにかく慣れないので普通のクラスをアスペクトにする。アノテーション@Aspectclassの前につけるとそのクラスがアスペクトになる。同じように@Pointcutと@Beforeや@Afterをメソッドの前につけるとAspectJ独自の構文と同じようにポイントカットとアドバイスを定義できる。

package com.rakugakicho.testaspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

	@Pointcut("call(@MyAnnotation * *.*(..))")
	public void MyPointCut(){

	}

	@Before("MyPointCut()")
	public void beforeMethod(){
		System.out.println("before");
	}

	@After("MyPointCut()")
	public void afterMethod(){
		System.out.println("after");
	}
}

@Pointcutのなかのcallにはアスペクトを織り込むメソッドを書き込む。ここではワイルドカードである*をつけて全てのクラスの全てのメソッドを指定している。ただ全てのメソッドを指定すると自分のメソッドまで指定してしまって都合が悪いのでアノテーションを使って織り込むメソッドを限定している。このアノテーションでの指定がかなり強力だと思っている。指定したメソッドのログをとりたいと思ったらアノテーションをつけてやればいいという感じでいろいろできそう。

実際に織り込むクラスを以下に示す。

package com.rakugakicho.testaspect;

public class TestMain {
	public static void main(String[] args){
		TestMain testMain = new TestMain();

		testMain.testMethod();
	}

	@MyAnnotation
	public void testMethod(){
		System.out.println("test");
	}
}

package com.rakugakicho.testaspect;

public @interface MyAnnotation {
  //アノテーションの書き方実はよくわかってない
}

実行結果は以下のようになる。

before
test
after

ちゃんと織り込まれている。

いろいろできそうだけどいまいち使い方がわからない。でもちょっとおもしろいので仕事以外にも活用してみたい。

本もウェブ上にもあまり情報がないが、この本が役に立ちそう。

AspectJ in Action: Enterprise AOP With Spring

AspectJ in Action: Enterprise AOP With Spring

洋書で骨が折れそうだが、まぁ英語の勉強にもなると思って読んでみることにする。

トラックバック - http://d.hatena.ne.jp/Tomato-360/20120719/1342708787
リンク元