包结构:

 Spring Aop AfterReturning接收返回值-DESTLIVE

Spring.xml

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

UserDao.java

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

测试类Main方法

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

LogAspect.java

 Spring Aop AfterReturning接收返回值-DESTLIVE

测试结果:

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

 

@AfterReturning标签属性分析:

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

         pointcut值:和value值用法一样

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

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

 

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

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

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

        

        

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

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

    Spring Aop AfterReturning接收返回值-DESTLIVE

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

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

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

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

 

  测试如下:

         ResultStr.java

     Spring Aop AfterReturning接收返回值-DESTLIVE

 

UserDao.java

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

增强类和测试方法

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

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

方式一.使用JoinPoint获取入参

 Spring Aop AfterReturning接收返回值-DESTLIVE

        

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

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

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

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

 Spring Aop AfterReturning接收返回值-DESTLIVE

 

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

 Spring Aop AfterReturning接收返回值-DESTLIVE