「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 !!
以上です。