9、环绕通知的执行顺序&抛出异常让其他通知感受到
9.1、环绕通知的执行顺序
将普通通知和环绕通知全都打开,一起运行
9.1.1、正常执行
运行结果:
9.1.2、异常执行
运行结果:
这是因为环绕通知首先捕获到异常,并在环绕通知的catch块中处理了,所以普通通知的异常通知就捕获不到了。
9.1.3、结论
环绕通知是优先于普通通知执行的:
环绕前置、普通前置、目标方法执行、环绕正常返回/出现异常、环绕后置、普通后置、普通返回/出现异常
9.2、抛出异常让其他通知知道
当程序出现了异常,而环绕通知和普通通知一起运行的时候,环绕通知的异常通知首先执行,并把异常在catch块中进行处理,外界的通知就无法捕获到这个异常,为了让外界知道这个异常,这个异常不能在环绕通知里面进行处理,要在环绕的catch块中将这个异常抛出去
} catch (Throwable e) {
//环绕的异常通知 @AfterThrowing
System.out.println("环绕异常通知:"+name+"方法出现了异常,异常信息是:"+e);
throw new RuntimeException(e);
运行结果:
现在外界的通知就能捕获到异常了。
9.2、环绕通知和普通通知的选择
1、普通通知:普通通知是不能影响到程序的运行的,只能在程序运行到某个阶段,去看一下程序都做了什么
2、环绕通知:环绕通知是可以影响到程序本身的,环绕通知的
proceed = pjp.proceed(args);
这个方法,决定了这个切面类能不能切入到目标方法中。
3、如果只是想看看程序运行的结果,那就选择普通通知,如果是想影响程序的运行,改变程序的一些值,那就可以使用环绕通知。