包结构:
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方法入参按照名称对应就可以实现后置增强得到入参了.