Spring aop不是在一个方法上触发的,而是在另一个方法上触发的

Spring aop不是在一个方法上触发的,而是在另一个方法上触发的,spring,aop,spring-aop,Spring,Aop,Spring Aop,我使用AOP将监视器与业务逻辑分开。但当我使用junit测试我的aop代码时,我发现aop不会在方法B执行时触发,而是在方法A执行时触发。方法B调用方法A 我的伪代码如下所示: @Aspect public class TimeMonitor { @Pointcut("execution( * MainClass.A(..))") public void pointA(); @Around("pointA()") Object monitorA(Proceedin

我使用AOP将监视器与业务逻辑分开。但当我使用junit测试我的aop代码时,我发现aop不会在方法B执行时触发,而是在方法A执行时触发。方法B调用方法A

我的伪代码如下所示:

@Aspect
public class TimeMonitor {
    @Pointcut("execution( * MainClass.A(..))")
    public void pointA();
    @Around("pointA()")
    Object monitorA(ProceedingJoinPoint jp ){
        try{
            jp.proceed();
        }catch(Exception e){
            logger.error("failed to execute A in TimeMonitor");
        }
    }
我的主要逻辑如下:

public class MainClass{
    public String A(){
    }
    public String B(){
        try{
            A();//call method A
        }catch(Exception e ){
            logger.error("failed to execute A in Main class");
        }
    }
}
然后,当我使用Junit进行单元测试时:

public TimeMonitorTest{
    @Test
    public void TestA(){
        //test code here
        A();
        //AOP method monitorA will be triggered;
    }
    @Test
    public void TestB(){
        B();
        //AOP method monitorA will not be triggered;
    }
}
那么,当我在MainClass中测试方法B时,为什么不触发monitorA()

有人能帮我吗


谢谢

这是一个经典的Spring AOP问题,在这里被问了很多次。您可以使用SpringAOP,这是一种基于代理的“AOPLite”方法。因此,只有在真正从类外部调用公共的非静态代理方法时,才会触发负责AOP的动态代理子类。内部方法调用不使用代理,而是直接转到原始对象的目标方法。你在测试中看到的行为是意料之中的


这一事实在中也有解释(在这里查找术语“自我调用”)。它还描述了AspectJ没有这种自调用问题,因为AspectJ不是基于代理的,而是一个成熟的AOP框架。

这是一个经典的Spring AOP问题,在这里被问了很多次。您可以使用SpringAOP,这是一种基于代理的“AOPLite”方法。因此,只有在真正从类外部调用公共的非静态代理方法时,才会触发负责AOP的动态代理子类。内部方法调用不使用代理,而是直接转到原始对象的目标方法。你在测试中看到的行为是意料之中的


这一事实在中也有解释(在这里查找术语“自我调用”)。它还描述了AspectJ不存在这种自调用问题,因为AspectJ不是基于代理的,而是一个成熟的AOP框架。

您究竟如何调用一个();在测试中,您可以重新格式化您的代码并为您的方法使用小写起始字母吗A()看起来像一个构造函数,而不是一个方法。还有如何在测试类中调用
A()
?您是否应该先实例化
main类
,然后从中调用
A()
?我怀疑你的
TimeMonitorTest
是否能编译;在测试中,您可以重新格式化您的代码并为您的方法使用小写起始字母吗A()看起来像一个构造函数,而不是一个方法。还有如何在测试类中调用
A()
?您是否应该先实例化
main类
,然后从中调用
A()
?我怀疑你的
TimeMonitorTest
是否能编译。