在學習Spring Aop時,遇到一個問題,當 @Around(環繞通知)與 @AfterReturning(後置通知)共存 時,@AfterReturning 通過屬性 returning = "var" 獲取目標方法的返回值時結果總為null,如下: 介面代碼: 目標類代碼: 切麵代碼: 運行結 ...
在學習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,當將環繞通知
註釋掉後,結果正確,如圖:
為什麼會出現這個問題?作為初學者的我也很懵逼,只是在不斷地嘗試中發現了它,我想將它分享出
來,避免大家也入坑。如有大牛知曉其中的原理,期待您的解惑,謝謝。