spring aop通知(advice)分成五类:
- 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
- 后置通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
- 异常通知[After throwing advice]:在连接点抛出异常后执行。
- 返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
- 环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
接下来通过编写示例程序来测试一下五种通知类型:
非注解方式
前置通知
定义aop类

- method:被调用的方法,就是连接点
- objects:被调用方法的参数
- o:调用被调用方法的对象
xml文件
注意要先在ioc容器中放入对象才能使用id引用。

<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>
执行结果

后置通知
后置通知与前置类似,只是参数和接口不同

多了一个
- returnValue:方法返回值
xml文件

执行结果

异常通知

Exception:异常类型


环绕通知
环绕通知很强大,上面那三个通知都可以做到。

xml文件配置方法相同。

如果invocation.proceed()没有写,那么这个切入点方法就不会被执行。但是环绕方法的通知会执行。
环绕通知底层通过拦截器实现。
注解形式
前置和后置通知

开启扫描器和对AOP注解支持

实现效果

异常通知


截获某种异常

若发生异常通知,后置通知将不会触发
环绕通知

最终通知
其实在环绕通知中已经实现了最终通知

