Springでアノテーションがついてるメソッドにアスペクトする方法

2015-03-17T00:00:00+09:00 Java Spring Framework

メソッドに特定のアノテーションをつけている場合に指定した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に依存する事無く発動するメソッド名等も自由に出来るのとメソッドが走る前に処理するような感じな事も出来る

doma2を使ってみる (4) - Domain - doma2を使ってみた (3) - @Repositoryを使う -