Spring AOP AspectJ で奇妙な動作が発生しています。自己呼び出しはアドバイスされるべきではありませんが、私のアプリケーションではアドバイスされています。春のドキュメントから:
ただし、呼び出しが最終的にターゲット オブジェクト (この場合は SimplePojo 参照) に到達すると、 this.bar() や this.foo() など、それ自体で行われる可能性のあるメソッド呼び出しは、この参照であり、プロキシではありません。これには重要な意味があります。これは、自己呼び出しによって、メソッド呼び出しに関連付けられたアドバイスが実行される可能性がないことを意味します。
しかし、私の単純なアプリケーションでは、次のように構成されています。
テストアスペクト
@Aspect
@Component
public class TestAspect {
private static final Logger logger = LoggerFactory.getLogger(TestAspect.class);
@Pointcut("execution(* org.mypackage.TestService.method(..))")
public void participateAroundPointcut(){}
@Around("participateAroundPointcut()")
public void testAround(ProceedingJoinPoint joinPoint) throws Throwable{
logger.debug("Pre-execution;");
joinPoint.proceed();
logger.debug("Post-execution");
}
}
TestService:
@Service
public class TestService {
private static final Logger logger = LoggerFactory.getLogger(TestService.class);
public void method(){
logger.debug("Executing method();");
}
public void service(){
logger.debug("Executing service();");
this.method();
}
}
および構成ファイル:
<context:component-scan base-package="org.mypackage" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="testAspect" class="org.mypackage.aop.aspects.TestAspect" factory-method="aspectOf"/>
私は自己呼び出しのアドバイスを受けます:
DEBUG: org.mypackage.TestService - Executing service();
DEBUG: org.mypackage.aop.aspects.TestAspect - Pre-execution;
DEBUG: org.mypackage.TestService - Executing method();
DEBUG: org.mypackage.aop.aspects.TestAspect - Post-execution
なぜこれが起こるのか分かりません。