我得到了 Spring AOP AspectJ 的一个奇怪行为:不应该建议自我调用,但在我的应用程序中它确实如此。来自Spring 文档:
但是,一旦调用最终到达目标对象,在这种情况下是 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");
}
}
测试服务:
@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
我不明白为什么会这样。