• Spring Aop AfterReturning接收返回值


    包结构:

     

    Spring.xml

     

    UserDao.java

     

    测试类Main方法

     

    LogAspect.java

     

    测试结果:

     

    @AfterReturning标签属性分析:

             value值: 可以写Aop的表达式,如execution、args、within等,多个之间使用&& || !作为连接; 也可以使用引用其他Pointcut;

             pointcut值:和value值用法一样

             returning值:给被增强方法返回值取个名字,给后面引用;

             argNames值:方法入参的名字,Spring4.2.x测试时候发现写不写都可以实现Aop,具体看下面测试.

             如果只需要记录方法返回值的话,只需要配置returning属性,方法入参配置上对应返回值类型或其父类即可,写Object应该肯定没问题吧;

     

             知识点1.returning属性的值和增强方法的入参是按照名称来匹配;

             当增强方法入参名称和returning不一致时,就会抛出异常Returning argument name 'val' was not bound in advice arguments

     

            

            

             知识点2. 增强方法入参不能出现多余(JoinPoint不算多余),否则会匹配不上; 如果想要获取被增强方法入参,方式有两种,下面有介绍.

     

             知识点3. 增强方法入参类型必须是 被增强方法返回值类型或者父类,否则增强方法无法执行; void类型的方法返回值是null,可以使用Object类型来接收

        

             知识点3查看源码可以得到解释, AspectJAfterReturningAdvice的afterReturning会先判断类型是否匹配来决定执行不执行后置增强;

     

    知识点4. 看到博文下在讨论能否改变方法返回值类型,下面讨论给出了答案:

    String类型的无法改变返回值类型,而对象类型的可以调用set方法将返回值属性改变;

    讨论地址:https://blog.csdn.net/owen_william/article/details/50812771#commentsedit

      测试如下:

             ResultStr.java

         

    UserDao.java

     

    增强类和测试方法

     

    知识点5.获取被增强方法入参的几种方式:

    方式一.使用JoinPoint获取入参

     

            

    方式二. 注解添加写argNames属性值

     

    分析: 被增强方法addUser我们用A来简称,增强方法getReturning用B来简称, A的入参和B的args()内参数按照顺序来对应;  args()内参数+returning值  与argnames中参数按照名称来对应,  而argNames的值与B入参按照顺序来对应,这点从下面名称不匹配可以证实;

     注意:argNames中一定要写returning的值

     

    方式三.注解不写argNames属性值

     

    分析:不写argNames属性值时候,  addUser仍然简称A方法,getReturning方法简称B方法, A方法的入参和B方法的args()括号内参数按照顺序对应, args()括号内参数和B方法入参按照名称对应就可以实现后置增强得到入参了.

     

  • 相关阅读:
    WordPress“无法将上传的文件移动至wp-content/uploads/”的解决办法
    npm安装less和less-loadernpm或者stylus和stylus-loader
    vue-cli脚手架安装
    JavaScript 中的回调函数
    css同时满足两个类名才有效果的写法
    jQuery对象与JS原生对象之间的转换
    css3在动画完成后执行事件
    5秒让你的View变3D,ThreeDLayout使用和实现
    给大家安利一个学习angular2的视频网站
    JAVA中的常量定义在class中还是interface中比较合理?
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10186862.html
Copyright © 2020-2023  润新知