Spring AOP 通知顺序

如果有多个通知在同一连接点执行,那执行顺序如何确定呢?

总共有两种情况:同一切面中通知执行顺序、不同切面中的通知执行顺序。

1、同一切面中通知执行顺序

1)前置通知/环绕通知proceed方法之前部分

2)被通知方法

3)后置通知/环绕通知proceed方法之后部分

annotation方式的顺序:环绕通知proceed方法之前部分---->前置通知---->被通知方法---->后置通知---->环绕通知proceed方法之后部分(多次测试结果显示如此,不知道具体原因)

XML配置方式:由配置顺序决定,例如

        <aop:aspect id="aopLogAspect" ref="logAspect">
            <aop:pointcut id="logApectPointcut" expression="execution(* test1.dao.*.add*(..))||
                        execution(* test1.dao.*.delete*(..))||
                        execution(* test1.dao.*.update*(..))||
                        execution(* test1.dao.*.load*(..))" />
            <aop:before method="logStart" pointcut-ref="logApectPointcut" />
            <aop:after method="logEnd" pointcut-ref="logApectPointcut" />
            <aop:around method="logAround" pointcut-ref="logApectPointcut" />
        </aop:aspect>

执行顺序是:前置通知---->环绕通知proceed方法之前部分---->被通知方法---->环绕通知proceed方法之后部分---->后置通知。其中before与around配置先后顺序会影响执行顺序,而after与around配置先后顺序则不会。(这是什么原因?)

2、不同切面中的通知执行顺序

当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。

如果需要他们顺序执行,可以通过指定切面的优先级来控制通知的执行顺序。

annotation方式:

1)@Order(int)指定优先级,例如@Order(1)---->@Order(2)

2)也可以通过在切面实现类上实现org.springframework.core.Ordered接口,由private int order 来指定优先级

XMl配置方式:可以由aop:aspect的order属性来指定,例如

        <aop:aspect id="aopLogAspect" ref="logAspect" order="1" >
            ......
        </aop:aspect>
        <aop:aspect id="aopTransactionAspect" ref=transactionAspect" order="2" >
            ......
        </aop:aspect>

aopLogAspect ----> aopTransactionAspect

补充:测试结果显示,默认顺序由XML配置先后顺序决定,例如上面的例子去掉order属性及其值,执行顺序不变。那么问题来了,“当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。”这句话是否正确?在annotation方式中没错,但XML配置方式却是...从测试结果来看,执行顺序似乎是确定的,是否真的如此,有待考证。

时间: 2024-08-13 22:30:35

Spring AOP 通知顺序的相关文章

Spring AOP通知实例 – Advice

Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能. 在Spring AOP中,有 4 种类型通知(advices)的支持: 通知(Advice)之前 - 该方法执行前运行 通知(Advice)返回之后 – 运行后,该方法返回一个结果 通知(Advice)抛出之后 – 运行方法抛出异常后, 环绕通知 – 环绕方法执行运行,结合以上这三

关于Spring Aop 通知类型

1. 前置通知 * 在目标类的方法执行之前执行. * 配置文件信息:<aop:after method="before" pointcut-ref="myPointcut3"/> * 应用:可以对方法的参数来做校验 2. 最终通知 * 在目标类的方法执行之后执行,如果程序出现了异常,最终通知也会执行. * 在配置文件中编写具体的配置:<aop:after method="after" pointcut-ref="myP

spring aop的五种通知类型

昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. 回答问题的关键是,你得知道aop有哪几种通知类型吧! spring aop通知(advice)分成五类: 前置通知[Before advice]: 在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. 正常返回通知[After returning advice]: 在连接点正常执行完

浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring框架的,这就说明你有权选择是否要用AOP来完成一些业务. AOP面向切面编程,通过另一种思考的方式,来弥补面向对象编程OOP当中的不足,OOP当中最重要的单元是类,所以万物皆对象,万物皆是 对象类.而在AOP的模块单元中,最基础的单元是切面,切面对切点进行模块化的管理. 最后再提一句:Spring当

开涛spring3(6.7) - AOP 之 6.7 通知顺序

如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序.总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. 首先让我们看下 1) 同一切面中通知执行顺序:如图6-6所示. 图6-6 同一切面中的通知执行顺序 而如果在同一切面中定义两个相同类型通知(如同是前置通知或环绕通知(proceed之前))并在同一连接点执行时,其执行顺序是未知的,如果确实需要指定执行顺序需要将通知重构到两个切面,然后定义切面的执行顺

spring AOP和通知

1.  spring的通知 1.1.  AOP的概念 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在Spring AOP中,切面可以使用基于模式或者基于注解的方式来实现. 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接点总是表示一个方法的执行. 通知(Advice):在切面的某个特定的连接点上执行的动作.其中包括了"aroun

Spring AOP 之 通知、连接点、切点、切面。

1:知识背景 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 2:面向切面的基本原理 什么是面向切面编程 横切关注点:影响应用多处的功能(安全.事务.日志) 切面: 横切关注点被模块化为特殊的类,这些类称为切面 优点: 每个关注点现在都集中于一处,而不是分散到多处代码中 服务模块更简洁,服务模块只需关注核心代码. AOP 术语 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了

spring aop环绕通知记录应用的日志

使用的框架是spring mvc+spring 最近想利用spring aop的环绕通知来处理web的日志问题,总的来讲,如果在controller层做切入,则难监控实际运行情况,在service层做切入,则只能监控到service层的情况,通过捕捉service抛出的异常来记录日志,对于目前本人应用而言,已经足够了,先将记录如下: 代码: @Component @Aspect public class ExceptionLog { /** * 61 * 环绕通知需要携带ProceedingJo

Spring AOP前置通知和后置通知

Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用AspectJ注解支持 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.weaver.jar和spring-aspects.jar 将aop Schema添加到<beans>根元素中. 要在Spring IOC容器