spring aop通知(advice)分成五类:
- 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
- 后置通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
- 异常通知[After throwing advice]:在连接点抛出异常后执行。
- 返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
- 环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
接下来通过编写示例程序来测试一下五种通知类型:
非注解方式
前置通知
定义aop类
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-70.png)
- method:被调用的方法,就是连接点
- objects:被调用方法的参数
- o:调用被调用方法的对象
xml文件
注意要先在ioc容器中放入对象才能使用id引用。
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-71-1024x280.png)
<bean id="logBefore" class="com.cztcode.spring.aop.LogBefore"/>
<aop:config>
<aop:pointcut id="point" expression="execution(public void com.cztcode.spring.impl.StudentServiceImpl.addStudent(com.cztcode.spring.entity.Student))"/>
<!-- 关联ref,当执行点时,执行advice-->
<aop:advisor advice-ref="logBefore" pointcut-ref="point"/>
</aop:config>
执行结果
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-72.png)
后置通知
后置通知与前置类似,只是参数和接口不同
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-73.png)
多了一个
- returnValue:方法返回值
xml文件
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-74-1024x126.png)
执行结果
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-75.png)
异常通知
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-76.png)
Exception:异常类型
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-78-1024x118.png)
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-77.png)
环绕通知
环绕通知很强大,上面那三个通知都可以做到。
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-81-1024x286.png)
xml文件配置方法相同。
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-82.png)
如果invocation.proceed()没有写,那么这个切入点方法就不会被执行。但是环绕方法的通知会执行。
环绕通知底层通过拦截器实现。
注解形式
前置和后置通知
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-83-1024x434.png)
开启扫描器和对AOP注解支持
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-84.png)
实现效果
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-85.png)
异常通知
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-86-1024x92.png)
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-87.png)
截获某种异常
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-91-1024x109.png)
若发生异常通知,后置通知将不会触发
环绕通知
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-88-1024x251.png)
最终通知
其实在环绕通知中已经实现了最终通知
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-89-1024x81.png)
![](https://www.cztcode.com/wp-content/uploads/2020/07/image-90.png)