在学习Spring Aop时,遇到一个问题,当 @Around(环绕通知)与 @AfterReturning(后置通知)共存

时,@AfterReturning 通过属性 returning = “var” 获取目标方法的返回值时结果总为null,如下:

接口代码:

package brave.domain;
public interface Cat {
    void eat();
    String run();
}

目标类代码:

@Component
public class CatImpl implements Cat {
    public void eat() {
        System.out.println("eat");
    }
    public String run() {
        System.out.println("run");
        return "我是返回值";
    }
}

切面代码:

@Aspect
@Component
public class CatAdvice {
    @Around("execution(* brave.domain.*.*(..))")
    public void around(ProceedingJoinPoint pjp){
        out.println("begin");
        try {
            pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        out.println("end");
    }
    @AfterReturning(pointcut = "execution(* brave.domain.*.*(..))", returning = "var")
    public void aferReturning(Object var){    //增强方法的入参名需与returning的值一致
        out.println("afterReturning");
        out.println(var);
    }
}

 运行结果:

在目标类的 run()中,我们返回了字符串 “我是返回值”,但运行结果却一直是null,当将环绕通知

注释掉后,结果正确,如图:

 

为什么会出现这个问题?作为初学者的我也很懵逼,只是在不断地尝试中发现了它,我想将它分享出

来,避免大家也入坑。如有大牛知晓其中的原理,期待您的解惑,谢谢。

posted on 2018-03-16 21:35 好好De活着 阅读() 评论() 编辑 收藏

版权声明:本文为brave7原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/brave7/p/8585625.html