问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
/*环绕通知
* 问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
* */
public void aroundPrintLog(){
System.out.println("(环绕通知)Logger类中的aroundPrintLog方法开始记录日志了");
}
<!--配置环绕通知 详细的注释请看logger类中-->
<aop:around method="aroundPrintLog" pointcut-ref="pt1"></aop:around>
问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
之前的动态代理中整个invoke里面的所有内容都称为环绕通知。它有明确的切入点调用,而我们这个没有
分析:通过对比动态代理中的环绕通知代码,发现动态代理中的环绕通知有明确的切入点方法调用,而我们的代码中没有。
解决:spring框架为我们提供了一个接口,ProceedingJoinPoint。该接口有一个方法proceed().此方法就相当于明确调用明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用
spring的环绕通知:它是spring框架为我们提供的一种可以在代码中手动控制增强代码何时执行的方式
public Object aroundPrintLog(ProceedingJoinPoint pjp){
Object rtValue=null;
try{
Object[] args=pjp.getArgs(); //得到方法执行所需的参数
System.out.println("(前置通知)Logger类中的beforePrintLog方法开始记录日志了");
rtValue=pjp.proceed(); //明确调用业务层方法(切入点方法)
System.out.println("(后置通知)Logger类中的afterReturningPrintLog方法开始记录日志了");
return rtValue;
}catch(Throwable t){ //这里要写Throwable,Exception拦不住它
System.out.println("(异常通知)Logger类中的afterThrowingPrintLog方法开始记录日志了");
throw new RuntimeException();
}finally{
System.out.println("(最终通知)Logger类中的afterPrintLog方法开始记录日志了");
}
}