参考原文链接: https://my.oschina.net/longfong/blog/805410
包结构:
Spring配置文件:
Service层文件
测试类:
切面文件:
情景一: 注解不包含argNames属性
测试结果:
分析:
情景一.1 当增强方法上参数名称与arg括号内参数名称不对应时,测试报错;
情景一.2 当增强方法上参数名称对应上,但是类型对应不上时,测试发现增强无效;
情景一.3 当增强方法参数名称与类型对应上,但是顺序颠倒时,测试成功
情景一.4 当增强方法参数多余或少于arg内参数时,测试报错
情景一情况总结: 在没有标注argNames的情况下,arg内参数是按照名称与待增强方法(本例中的addUser)对应,顺序随意,且参数个数要符合待增强方法; 切面中的方法入参个数以及名称、类型需要与arg内参数相匹配才可以,但是顺序可以打乱;也可以使用JoinPoint方法获取入参(前提是JoinPoint一定是第一个参数).
情景二: 注解中包含argNames属性;
分析:arg()括号内的为按照顺序和待增强方法对应,argNames中的为按照名字和arg()内对应,而切面的方法又和argNames的参数按照顺序对应;
情景二.1 改变切面中方法参数,和argNames中参数保持名称不一致时,测试成功,可见argNames参数和增强方法中参数确实是按照顺序对应,而非名称对应;
情景二.2 改变argNames和arg()内的参数无法按照名称对应上时,测试报错,可见argNames和arg()内参数确实按照名称对应.
情景二.3 改变切面增强方法入参的顺序时,测试发现增强没起作用,再次验证了argNames参数和增强方法入参是按照顺序来对应的;
情景二.4 JoinPoint用法: JointPoint必须放在参数第一个,其他位置都会报错,因为底层判断的时候只检查第一个参数是否是JoinPoint或者ProceedingJoinPoint或者另一种类型;
情景三:
分析:PointCut注解下方法入参需要与增强方法入参一致,类型顺序都要一样;Pointcut注解arg()和argNames不一定非要都出现;
情景三.1
分析:argNames和arg()不一定需要成对出现,如下情形时:Pointcut中arg按照顺序和 被增强方法(addUser)对应,且arg()内参数和Pointcut下方法入参按照名称对应;
切面中的方法(beginLog)的注解上的test1(a,b)按照顺序和Pointcut中arg()内参数对应,切面中的方法(beginLog)入参和注解上的test1(a,b)入参按照名称对应;
原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10182382.html