Spring Aop 注解方式参数传递

参考原文链接: https://my.oschina.net/longfong/blog/805410

包结构:

Spring配置文件:

 

Service层文件

 

测试类:

切面文件:

         情景一:  注解不包含argNames属性

 

测试结果:

分析:

 

         情景一.1 当增强方法上参数名称与arg括号内参数名称不对应时,测试报错;

 

         情景一.2 当增强方法上参数名称对应上,但是类型对应不上时,测试发现增强无效;

 

 情景一.3 当增强方法参数名称与类型对应上,但是顺序颠倒时,测试成功

 

         情景一.4 当增强方法参数多余或少于arg内参数时,测试报错

 

情景一情况总结: 在没有标注argNames的情况下,arg内参数是按照名称与待增强方法(本例中的addUser)对应,顺序随意,且参数个数要符合待增强方法;  切面中的方法入参个数以及名称、类型需要与arg内参数相匹配才可以,但是顺序可以打乱;也可以使用JoinPoint方法获取入参(前提是JoinPoint一定是第一个参数).

 

        

情景二: 注解中包含argNames属性;

 

分析:args()括号内的为按照顺序和待增强方法对应,argNames中的为按照名字和args()内对应,而切面的方法又和argNames的参数按照顺序对应;

  情景二.1 改变切面中方法参数,argNames中参数保持名称不一致时,测试成功,可见argNames参数和增强方法中参数确实是按照顺序对应,而非名称对应;

 

情景二.2 改变argNamesargs()内的参数无法按照名称对应上时,测试报错,可见argNamesargs()内参数确实按照名称对应.

 

 情景二.3 改变切面增强方法入参的顺序时,测试发现增强没起作用,再次验证了argNames参数和增强方法入参是按照顺序来对应的;

 

  情景二.4 JoinPoint用法: JointPoint必须放在参数第一个,其他位置都会报错,因为底层判断的时候只检查第一个参数是否是JoinPoint或者ProceedingJoinPoint或者另一种类型;

    

情景三:

 

分析:PointCut注解下方法入参需要与增强方法入参一致,类型顺序都要一样;Pointcut注解args()argNames不一定非要都出现;

 

  情景三.1

 

  分析:argNamesargs()不一定需要成对出现,如下情形时:Pointcutarg按照顺序和 被增强方法(addUser)对应,arg()内参数和Pointcut下方法入参按照名称对应;

切面中的方法(beginLog)的注解上的test1(a,b)按照顺序和Pointcutarg()内参数对应,切面中的方法(beginLog)入参和注解上的test1(a,b)入参按照名称对应;

  

猜你喜欢

转载自www.cnblogs.com/lvbinbin2yujie/p/10182382.html