在学习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,当将环绕通知
注释掉后,结果正确,如图:
为什么会出现这个问题?作为初学者的我也很懵逼,只是在不断地尝试中发现了它,我想将它分享出
来,避免大家也入坑。如有大牛知晓其中的原理,期待您的解惑,谢谢。