关于环绕通知方法的返回值问题:
如果目标方法的返回值为void,环绕通知的返回值就可以为void(这时也可以非空,比如为Object),如果目标方法的返回值不为空,则环绕通知的返回值必须非空(比如就可以为Object)
看代码:一个接口,一个接口实现类,一个切面类
public interface Calculator {
void add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
@Component
public class CalculatorLogImpl implements Calculator{
@Override
public int add(int i, int j) {
int result = i + j;
return result;
}
@Override
public int sub(int i, int j) {
int result = i - j;
return result;
}
@Override
public int mul(int i, int j) {
int result = i * j;
return result;
}
@Override
public int div(int i, int j) {
int result = i / j;
return result;
}
}
@Aspect
@Component
public class LogAspect {
//前置、后置、返回、异常通知都删了,重点看环绕
@Around(value = "execution(* aop.CalculatorLogImpl.add(..))")
public Object aroundMethod(ProceedingJoinPoint joinPoint){
System.out.println("环绕通知:方法调用前");
Object proceed=null;
try {
proceed = joinPoint.proceed();
System.out.println("环绕通知:方法调用后");
} catch (Throwable e) {
System.out.println("环绕通知:调用目标方法出现异常时");
throw new RuntimeException(e);
}finally {
System.out.println("环绕通知:目标方法执行完毕");
}
return proceed;
}
}
测试:
ApplicationContext context=new ClassPathXmlApplicationContext("bean-aop.xml");//xml中配置了扫包和 <aop:aspectj-autoproxy/>;
Calculator bean = (Calculator)context.getBean(Calculator.class);
bean.add(1,1);
此时目标方法返回值为int ,而环绕通知返回值为空,就会报类似这样的错误:Null return value from advice does not match primitive return type for: public abstract int aop.Calculator.add(int,int);
而如果add方法的返回值为void,环绕通知的返回值就可以为void(也可以为Object或者其他)。