Spring AOP 通知类型实现

spring aop通知(advice)分成五类:

  1. 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
  2. 后置通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
  3. 异常通知[After throwing advice]:在连接点抛出异常后执行。
  4. 返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
  5. 环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

接下来通过编写示例程序来测试一下五种通知类型:

非注解方式

前置通知

定义aop类

image 70
  • method:被调用的方法,就是连接点
  • objects:被调用方法的参数
  • o:调用被调用方法的对象

xml文件

注意要先在ioc容器中放入对象才能使用id引用。

image 71
 <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>

执行结果

image 72

后置通知

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

image 73

多了一个

  • returnValue:方法返回值

xml文件

image 74

执行结果

image 75

异常通知

image 76

Exception:异常类型

image 78
image 77

环绕通知

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

image 81

xml文件配置方法相同。

image 82

如果invocation.proceed()没有写,那么这个切入点方法就不会被执行。但是环绕方法的通知会执行。

环绕通知底层通过拦截器实现。

注解形式

前置和后置通知

image 83

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

image 84

实现效果

image 85

异常通知

image 86
image 87

截获某种异常

image 91

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

环绕通知

image 88

最终通知

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

image 89
image 90

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注