Springでアノテーションがついてるメソッドにアスペクトする方法
メソッドに特定のアノテーションをつけている場合に指定したMethodInterceptorを実行する機能があるっぽいのでやってみた
SampleService.java
package sample;
import org.springframework.stereotype.Service;
@Service
public class SampleService {
@SampleAnnotation
public void say1() {
System.out.println("hoge");
}
public void say2() {
System.out.println("fuga");
}
}
@SampleAnnotationっていうのをsay1にのみ適応しておく。でこのアノテーションがついてるメソッドに限ってMethodInterceptorを実装したインターセプターを発動させるようにする
SampleInterceptor.java
package sample;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.stereotype.Component;
@Component
public class SampleInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation inv) throws Throwable {
System.out.println("before");
Object retval = inv.proceed();
System.out.println("after");
return retval;
}
}
とくにいうことないので省略
applicationContext.xml
<?xml version="1.0" ?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<context:component-scan base-package="sample" />
<aop:config>
<aop:advisor
pointcut="@annotation(sample.SampleAnnotation)"
advice-ref="sampleInterceptor" />
</aop:config>
</beans>
終わり。で@AutowiredでSampleServiceをinjectして定義したメソッドをコールすると
before hoge after fuga
っていうような出力結果になる。say1ではアノテーションが付与されているのでMethodInterceptorが発動してるがsay2メソッド側ではアノテーションがついてないので処理されない
んまぁっていう感じで指定したアノテーションがついているような場合において特定のインターセプターを挟んで処理する事が出来るっぽい
ちなみに<aop:around>等を用いる事でMethodInterceptorに依存する事無く発動するメソッド名等も自由に出来るのとメソッドが走る前に処理するような感じな事も出来る