1. 程式人生 > >Spring Aop AfterReturning接收返回值

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