五种增强/通知
上面的@Before和@After只是aop五种增强也叫通知的其中两种。执行顺序各有不同。
前置通知(@Before)
后置通知(@Ater)
返回通知(@AfterReturning)
异常通知(@AfterThrowing)
环绕通知(@Around)
异常通知和返回通知只会有一个出现,目标方法异常后会进入异常通知方法,不会进入返回通知方法。
正常执行会进入返回通知方法,不会进入异常通知方法。
@Before("log()") public void doBefore() { System.out.println("前置通知-Before"); } @After("log()") public void doAfter() { System.out.println("后置通知-After"); } @AfterReturning("log()") public void doAfterReturning() { System.out.println("返回通知-AfterReturning"); } @AfterThrowing("log()") public void doAfterThrowing() { System.out.println("异常通知-AfterThrowing"); }
目标方法正常执行的情况下打印:
前置通知-Before 后置通知-After 返回通知-AfterReturning
目标方法异常执行的情况下打印:
前置通知-Before 后置通知-After 异常通知-AfterThrowing
环绕通知比较特殊,ProceedingJoinPoint.proceed()方法表示继续执行目标方法。
环绕通知的返回值就是目标方法的返回值。如果没有返回值,目标方法也没有了。
@Around("log()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) { System.out.println("环绕通知开始-Around"); Object o = null; try { o = proceedingJoinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("环绕通知结束-Around"); return o; }
加入环绕通知后的执行顺序
环绕通知开始-Around 前置通知-Before 环绕通知结束-Around 后置通知-After 返回通知-AfterReturning
proceed()方法的有参方法甚至可以修改目标方法的参数,传入一个Object数组
Object[] var1 = new Object[]{"参数a"}; o = proceedingJoinPoint.proceed(var1);
由此可见,环绕通知可以用于对业务逻辑判断后可以修改目标方法入参的场景。