zoukankan      html  css  js  c++  java
  • Spring @AfterReturning 总是返回null

    在学习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,当将环绕通知

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

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

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

  • 相关阅读:
    微信公众平台接口获取时间戳为10位,java开发需转为13位
    redis实现哨兵机制
    redis配置主从复制
    C 语言字符 和字符串输出
    C 小写字母编程大写并输出
    C语言计算机器运行时间
    C 猜数游戏
    C 产生随机码 (输入数字来产生)
    C 产生随机码
    C 语言链表操作例程 (待完善)
  • 原文地址:https://www.cnblogs.com/brave7/p/8585625.html
Copyright © 2011-2022 走看看