@AfterReturning如果和@Around一起使用,那么就需要给@Around的方法设置返回参数,因为@AfterReturning接收到的值其实是@Around返回的。
如果@Around的方法没设置返回参数,有2种可能:
1.@AfterReturning接收到的返回值为null
2.如果目标方法的返回值类型不是封装类型如Integer,而是基本类型比如int,则执行会报错:
org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public abstract int cn.e_aop_anno.IUserDao.deleteById(int)
如果将目标方法返回类型改成封装类型如Integer,则执行不报错,但是接收到的返回值为null;即可能1写的结果。
// 指定切入点表达式:拦截哪些方法,即为哪些类生成代理对象
@Pointcut("execution(* cn.e_aop_anno.*.*(..))")
public void pointCut_() {}
// 返回后通知:在调用目标方法结束后执行【出现异常,不执行】
@AfterReturning(value="pointCut_()",returning="retValue")
public void afterReturning(JoinPoint jp, Object retValue) {
System.out.println("Aop.afterReturning() 目标方法+"+jp.getSignature().getName()+"返回值:" + retValue);
}
@Around(value="pointCut_()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕开始...");
Object retValue = pjp.proceed();// 执行目标方法
System.out.println("环绕结束...");
return retValue;
}
/*
*此时要么执行报错类型不匹配,要么@AfterReturning的返回值retValue是null
@Around(value="pointCut_()")
public void around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕开始...");
pjp.proceed();// 执行目标方法
System.out.println("环绕结束...");
}*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)