(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小时内删除。
发表评论