かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

アノテーション版!

前の日記で書いたAspectJのハローワールドをアノテーションを使ったものに書きかえてみた。

書き換え前

package org.okazuki.aspectj.hello;

public aspect HelloWorldAspect {
	
	pointcut sayHello() : execution(public void HelloWorld.sayHello());
	
	before() : sayHello() {
		System.out.println("before Hello world");
	}

	after() returning() : sayHello() {
		System.out.println("after Hello world");
	}
}

書き換え後

package org.okazuki.aspectj.hello;

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 AnnotationAspect {

	@Pointcut("execution(public void HelloWorld.sayHello(..))")
	public void sayHello() {
	}
	
	@Before("sayHello()")
	public void before() {
		System.out.println("before Hello world");
	}
	
	@After("sayHello()")
	public void after() {
		System.out.println("after Hello world");
	}
}


Aroundのほうも

書き換え前

package org.okazuki.aspectj.hello;

public aspect HelloWorldAspect {
	
	pointcut sayHello() : execution(public void HelloWorld.sayHello());
	
	void around() : sayHello() {
		System.out.println("around Hello world");
		proceed();
		System.out.println("around Hello world");
	}
}

書き換え後

package org.okazuki.aspectj.hello;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AnnotationAspect {

	@Pointcut("execution(public void HelloWorld.sayHello(..))")
	public void sayHello() {
	}
	
	@Around("sayHello()")
	public void around(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("around Hello world");
		joinPoint.proceed();
		System.out.println("around Hello world");
	}
}


完璧にJavaになってる!ってのが嬉しいところ。
ただ、pointcutを定義するときにIDEのコード支援を使わないと書けない体なのでちょっと辛い。
@Pointcut()までうって括弧のなかでコード支援使ってexecution ....を書いてから、""でかこって文字列にしよう。
それが楽。