包結構:

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方法入參按照名稱對應就可以實現后置增強得到入參了.

