「Spring」Bean 定義ファイルで AOP する

今回は Spring で Bean 定義ファイルを使って AOP してみたので、その時のメモ。

アノテーション使う AOP は以下のエントリーで。
必要なライブラリとかは、ここにまとめているつもりです・・・
http://a4dosanddos.hatenablog.com/entry/2013/07/13/135653

ドキュメント的には、以下あたりが該当する。
・9.3 Schema-based AOP support
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-schema

■ AspectSample.java

package hello.no.annotetion.sample;

import org.aspectj.lang.ProceedingJoinPoint;

public class AspectSample {

	public void before() {
		System.out.println("before !!");
	}

	public void after() {
		System.out.println("after !!");
	}

	public void afterReturning(String s) {
		System.out.println("after returning !!");
		System.out.println("return : " + s);
	}

	public String around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("around before !!");
		String s = (String) pjp.proceed();
		System.out.println("around after !!");
		return s;
	}

	public void afterThrowing(Throwable ex) {
		System.out.println("after throwing !!");
	}
}

■ applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
        
	<bean id="hello" class="hello.no.annotetion.sample.HelloImpl" autowire="byType" />
	<bean id="person" class="hello.no.annotetion.sample.PersonImpl" />
	<bean id="AspectSample" class="hello.no.annotetion.sample.AspectSample" />
	
	<aop:config>
	  <aop:aspect id="Aspect" ref="AspectSample">
	    <aop:pointcut expression="execution(* hello())" id="test" />
	    <aop:before method="before" pointcut-ref="test" />
	    <aop:after method="after" pointcut-ref="test" />
	    <aop:after-returning method="afterReturning" pointcut-ref="test" returning="s" />
	    <aop:around method="around" pointcut-ref="test" />
	    <aop:after-throwing method="afterThrowing" pointcut-ref="test" throwing="ex" />
	  </aop:aspect>
	</aop:config>
	
</beans>

以下のエントリーで書いた、Hello#hello() に対して Advice 動くようにしている感じです。
http://a4dosanddos.hatenablog.com/entry/2013/07/07/001245

うまく動いてそうですな。

before !!
around before !!
after !!
after returning !!
return : Hello hoge
around after !!

ちなみに afterThrowing を動かしたい場合は、こんな感じで RuntimeException でも投げてやれば。
■ HelloImpl.java

- 略 -
	public String hello() {
		// return "Hello " + person.getName();
		throw new RuntimeException();
	}
- 略 -

動いてますね。

before !!
around before !!
after !!
after throwing !!


以上です。