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类

  • 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注解支持

实现效果

异常通知

截获某种异常

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

环绕通知

最终通知

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

发表评论