Spring Aop AfterReturning接收返回值
包結構:
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方法入參按照名稱對應就可以實現後置增強得到入參了.