zoukankan      html  css  js  c++  java
  • 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方法入参按照名称对应就可以实现后置增强得到入参了.

     

  • 相关阅读:
    HPB 是什么
    HPB共识算法选举机制描述
    【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)
    大讲堂专访丨连接Oracle DBA与开发的桥梁:Oracle的redo与undo
    SCN风波又起,2019年6月之前Oracle必须升级吗?
    去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4
    OpenStack 的单元测试
    创建docker镜像的两种方式
    Vue.js 条件渲染 v-if、v-show、v-else
    Linux下Wiki服务器的搭建
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10186862.html
Copyright © 2011-2022 走看看