(III)AOP:第七节:环绕通知
⼀、环绕通知
(1)环绕通知是所有通知类型中功能最为强⼤的,能够全⾯地控制连接点,甚⾄可以控制是否执⾏连接点;
(2)对于环绕通知来说,连接点的参数类型必须是ProceedingJoinPoint。它是 JoinPoint 的⼦接⼝,允许控制何时执⾏,是否执⾏连接点;
(3)在环绕通知中需要明确调⽤ ProceedingJoinPoint 的 proceed() ⽅法来执⾏被代理的⽅法。如果忘记这样做就会导致通知被执⾏了,但⽬标⽅法没有被执⾏;
(4)注意:环绕通知的⽅法需要返回⽬标⽅法执⾏之后的结果,即调⽤ joinPoint.proceed() 的返回值,否则会出现空指针异常;
   环绕通知:
/**
* @Around:环绕:是Spring 中强⼤的通知,本质就是动态代理
*
* try{
spring framework组件*      //前置通知
*      method.invoke(obj,args);
*      //返回通知
* }catch(e){
*      //异常通知
* }finally{
*    //后置通知
* }
*
* 四合⼀通知就是环绕通知
* 环绕通知中有⼀个参数:ProceedingJoinPoint pjp
*/
@Around("myPoint()")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
String methodName = Signature().getName();
Object[] args = Args();
Object proceed = null;
try {
//@Before
System.out.println("【环绕前置通知】---"+ methodName +"---【⽅法开始】");
/
/就是利⽤反射调⽤⽬标⽅法即可,就是 method.invoke(obj, args)
proceed = pjp.proceed(args);
//@AfterReturning
System.out.println("【环绕返回通知】---"+ methodName +"---【⽅法返回,返回值 "+ proceed +"】");
} catch (Exception e) {
//@AfterThrowing
System.out.println("【环绕异常通知】---"+ methodName +"---【⽅法出现异常】,异常信息:" + e);
} finally {
//@After
System.out.println("【环绕后置通知】---"+ methodName +"---【⽅法结束】");
}
/
/反射调⽤后的返回值也⼀定返回出去,不返回会空指针
return proceed;
}
⼆、环绕通知顺序&抛出异常让其他通知感受到
  当同时使⽤了环绕通知和普通通知,再来看⼀下执⾏顺序:
/*
* 环绕通知:是优先于普通通知执⾏,执⾏顺序:
*
*  普通通知:
*  [普通前置]
*  ⽬标⽅法执⾏
*  [普通后置]
*  [普通⽅法返回/⽅法异常]
*
*
*  普通通知+环绕通知
*
* 【普通前置】
*
*  {
*  try{
*      环绕前置
*      环绕执⾏⽬标⽅法:⽬标⽅法执⾏
*      环绕返回
*  }catch(){
*      环绕异常
*  }finally
*      环绕后置
*      }
*  }
*  【普通后置】
*  【普通⽅法返回/⽅法异常】
*
*
*
*  新的顺序:
*      环绕前置 --- 普通前置 --- ⽬标⽅法执⾏ --- 环绕返回/异常 --- 环绕后置 --- 普通返回/异常 --- 普通后置    *
*
*  注意:环绕通知的异常⼀定要抛出去
*
*/
@Around("myPoint()")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
String methodName = Signature().getName();
Object[] args = Args();
Object proceed = null;
try {
//@Before
System.out.println("【环绕前置通知】---"+ methodName +"---【⽅法开始】");
//就是利⽤反射调⽤⽬标⽅法即可,就是 method.invoke(obj, args)
proceed = pjp.proceed(args);
//@AfterReturning
System.out.println("【环绕返回通知】---"+ methodName +"---【⽅法返回,返回值 "+ proceed +"】");        } catch (Exception e) {
//@AfterThrowing
System.out.println("【环绕异常通知】---"+ methodName +"---【⽅法出现异常】,异常信息:" + e);
//为了让外界能知道这个异常,这个异常⼀定要抛出去
throw new RuntimeException(e);
} finally {
//@After
System.out.println("【环绕后置通知】---"+ methodName +"---【⽅法结束】");
}
//反射调⽤后的返回值也⼀定返回出去,不返回会空指针
return proceed;
}
  执⾏顺序:
  注意:环绕通知⾥⾯的异常⼀定要抛出去。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。