參考原文鏈接: 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 改變argNames和args()內的參數無法按照名稱對應上時,測試報錯,可見argNames和args()內參數確實按照名稱對應.

情景二.3 改變切面增強方法入參的順序時,測試發現增強沒起作用,再次驗證了argNames參數和增強方法入參是按照順序來對應的;

情景二.4 JoinPoint用法: JointPoint必須放在參數第一個,其他位置都會報錯,因為底層判斷的時候只檢查第一個參數是否是JoinPoint或者ProceedingJoinPoint或者另一種類型;

情景三:

分析:PointCut注解下方法入參需要與增強方法入參一致,類型順序都要一樣;Pointcut注解args()和argNames不一定非要都出現;
情景三.1

分析:argNames和args()不一定需要成對出現,如下情形時:Pointcut中arg按照順序和 被增強方法(addUser)對應,且arg()內參數和Pointcut下方法入參按照名稱對應;
切面中的方法(beginLog)的注解上的test1(a,b)按照順序和Pointcut中arg()內參數對應,切面中的方法(beginLog)入參和注解上的test1(a,b)入參按照名稱對應;
