【原】不定义Order属性,通过切面类的定义顺序来决定通知执行的先后顺序

【结论】

不同切面类执行时,在没有定义“order属性”,而且切面类中触发增强通知的切入点都相同,则在切面类中的通知的执行顺序与该切面类在<aop:config>元素中“声明的顺序”相关,先声明的切面类先执行,后声明的切面类后执行

【代码示例】

 1 <aop:config>
 2     <!-- 用户自定义的切面01,用于不同切面类执行顺序的测试 -->
 3     <aop:aspect id="myMethod01Aspect" ref="myMethod01Bean">
 4         <aop:before method="myBeforeMethod01"  pointcut="execution(* com.zjrodger.bakdata.service..*.*(..))"/>
 5     </aop:aspect>
 6
 7     <!-- 用户自定义的切面02,用于不同切面类执行顺序的测试。 -->
 8     <aop:aspect id="myMethod02Aspect" ref=" myMethod02Bean">
 9          <aop:before method=" myBeforeMethod02"  pointcut="execution(* com.zjrodger.bakdata.service..*.*(..))"/>
10     </aop:aspect>
11 </aop:config>

不同切面类配置示例

【运行说明】
上述<aop:config>元素中,定义了两个切面类:“myMethod01Aspect类”和“myMethod01Aspect类”,这两个切面类都没有指定“order属性”,两个切面类中触发增强通知的切入点都相同。
当程序执行时并且触发切入点后,myMethod01Aspect类中的myBeforeMethod01()方法首先执行,之后才会执行myMethod02Aspect类中的myBeforeMethod02()方法。
若将上述<aop:config>元素中,两个切面类的定义顺序互换,则最终增强通知的执行顺序也会与上述相反。

【注意点】
若<aop:config>元素中同时存在“<aop:advisor>”元素和“<aop:aspect>元素”(“<aop:pointcut>元素” 可有可无),则这些元素必须按照< aop:pointcut >,<aop:advisor>和<aop:aspect>此顺序来定义
正因为“<aop:advisor>”元素和“<aop:aspect>元素”定义顺序是不能调整的,从而导致在没有指定 “order属性”的前提下,“<aop:advisor>”元素对应切面类中通知的执行顺序优先于“<aop:aspect>元素” 对应切面类中通知的执行。
此时,只能通过指定Order属性来调整这两个切面类中通知执行的先后顺序了。

【参考资料】
01:《在应用层通过spring特性解决数据库读写分离》http://jinnianshilongnian.iteye.com/blog/1720618#comments
02:《AOP 之 6.7 通知顺序 ——跟我学spring3》http://jinnianshilongnian.iteye.com/blog/2235572

时间: 2024-12-29 10:16:03

【原】不定义Order属性,通过切面类的定义顺序来决定通知执行的先后顺序的相关文章

【原】Order属性决定了不同切面类中通知执行的先后顺序

[障碍再现] MyBatis配置多数据源时,数据源切换失败. [原因分析]    自定义切面和Spring自带事务切面“即<aop:advisor>”执行的先后顺序导致数据源不能切换成功. [解决方案]1.配置代码 1 <aop:config> 2 <!-- 1.Spring框架自身提供的切面 --> 3 <aop:advisor advice-ref="userTxAdvice" pointcut="execution(public

spring-在切面类中定义私有方法解决重复编写execution函数

一.创建项目    项目名称:spring101002二.添加jar包    1.在项目中创建lib目录        /lib    2.在lib目录下添加相关spring jar包        --用于AspectJ        com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar        spring-aspects-3.2.0.RELEASE.jar        --用于切面编程        com.springsour

JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方

面向对象-类的定义和实例化

面向对象是一种认识世界,分析世界的方法论,将万事万物抽象为类 类class 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征集合 用计算机语言来描述类,就是属性和方法的集合 对象instance,object 对象是类的具象,是一个实体 一切皆对象 对象是数据和操作的封装 对象是独立的,但是对象之间可以相互作用 面向对象三要素 1.封装 组装,将数据和操作组装到一起 隐藏数据,对外只暴露一些接口,通过接口访问对象 2.继承 多复用,继承来的就不用自己写 多继承少修改,ocp使用继承来改变,

Ruby学习: 类的定义和实例变量

ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 def关键字开头,后面跟方法名及参数列表(如果有的话),以 end标识符结尾. 类也有构造函数,名字必须为initialize. 对象通过new来创建,new是类的方法. 举例如下: class Demo def initialize puts "begin create object"

javascript构造函数类和原型prototype定义的属性和方法的区别

1.把方法写在原型中比写在构造函数中消耗的内存更小,因为在内存中一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份而写在类中的方法,实例化的时候会在每个实例中再复制一份,所以消耗的内存更高所以没有特殊原因,我们一般把属性写到类中,而行为写到原型中2.构造函数中定义的属性和方法要比原型中定义的属性和方法的优先级高,如果定义了同名称的属性和方法,构造函数中的将会覆盖原型中的代码如下: <!DOCTYPE html> <html> <

java的属性只能在类里面 方法外面定义

java的属性只能在类里面 方法外面定义 区别于python:python 既能在类里面(类属性) 又能在方法里面定义属性(实例属性) 原文地址:https://www.cnblogs.com/classmethond/p/9901993.html

【速记速学】Python类的定义,属性,方法,访问性!

前言: Python 随着人工智能,机器学习,深度学习,AI 的发展,迅速成为宠儿. 今天,花 5 分钟时间,解读下Python中的类,定义,使用等. 如何定义自己的类呢? 01 类(对象) class dog(object)以上定义了一个dog对象,它继承于根类object. 02 类的属性 def init(self, name, dtype):self.name = nameself.dtype = dtype以上定义了dog对象的两个属性:name, dtype,通过init,这个系统函

(一)Python入门-6面向对象编程:02类的定义-类和对象的关系-构造函数-实例属性-实例方法

一:类的定义 如果把对象比作一个“饼干”,类就是制造这个饼干的“模具”. 我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”.类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”. 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态).更具体一点:“方法代码是共享的,属性数据不共享”. Python中,“一切皆对象”.类也称为“类对象”,类的实例也称为“