在學習Spring Aop時,遇到一個問題,當 @Around(環繞通知)與 @AfterReturning(后置通知)共存
時,@AfterReturning 通過屬性 returning = "var" 獲取目標方法的返回值時結果總為null,如下:
接口代碼:
package brave.domain; public interface Cat { void eat(); String run(); }
目標類代碼:
@Component public class CatImpl implements Cat { public void eat() { System.out.println("eat"); } public String run() { System.out.println("run"); return "我是返回值"; } }
切面代碼:
@Aspect @Component public class CatAdvice { @Around("execution(* brave.domain.*.*(..))") public void around(ProceedingJoinPoint pjp){ out.println("begin"); try { pjp.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } out.println("end"); } @AfterReturning(pointcut = "execution(* brave.domain.*.*(..))", returning = "var") public void aferReturning(Object var){ //增強方法的入參名需與returning的值一致 out.println("afterReturning"); out.println(var); } }
運行結果:
在目標類的 run()中,我們返回了字符串 “我是返回值”,但運行結果卻一直是null,當將環繞通知
注釋掉后,結果正確,如圖:
為什么會出現這個問題?作為初學者的我也很懵逼,只是在不斷地嘗試中發現了它,我想將它分享出
來,避免大家也入坑。如有大牛知曉其中的原理,期待您的解惑,謝謝。