【结论】

在多个切面类的“切入点相同”并且每个切面都“没有定义order属性”的情况下,则切面类(中的通知)的执行顺序与该切面类在<aop:config>元素中“声明的顺序”相关,即先声明的切面类先执行,后声明的切面类后执行。

【代码示例】

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

不同切面类配置示例

【运行说明】
上述<aop:config>元素中,定义了两个切面类:“myMethod01Aspect类”和“myMethod02Aspect类”,这两个切面类都没有指定“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

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

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

    [障碍再现] MyBatis配置多数据源时,数据源切换失败. [原因分析]    自定义切面和Spring自带事务切面“即<aop:advisor>”执行的先后顺序导致数据源不能切换成功. ...

  2. C++基础学习8:类的定义(class)

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错(??) b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1byte c) C语言中的结构体只涉及到 ...

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

    在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等.     一,概述 在Java语言中 ...

  4. Java:【面向对象:类的定义,静态变量,成员变量,构造函数,封装与私有,this】

    本文内容: 什么是面对对象 类的定义与对象实例化 成员变量 成员变量的有效范围 成员变量的赋值 静态变量.方法与实例变量.方法 构造函数 封装与私有 this关键字 注:函数和方法是一样东西.[由于我 ...

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

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

  6. C++ 类外定义

    类内定义与内联函数 像下面这种函数名与函数体都写在类里面的函数形式被称作类内定义,编译器编译的时候会把它默认成内联函数. class Student { public: void setAge(int ...

  7. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

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

    java的属性只能在类里面 方法外面定义 区别于python:python 既能在类里面(类属性) 又能在方法里面定义属性(实例属性)

  9. javascript 构造函数类和原型 prototyp e定义的属性和方法的区别

    1.把方法写在原型中比写在构造函数中消耗的内存更小,因为在内存中一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份而写在类中的方法,实例化的时候会在每 ...

随机推荐

  1. 使用UDP和TCP协议的各种应用和应用层协议

    IGMP和ICMP是传输层协议

  2. 八、springboot整合redis

    整合Redis 一. 注解方式实现添加缓存 1.在pom.xml加入依赖 <!-- 配置使用redis启动器 --> <dependency> <groupId>o ...

  3. python基础--random模块

    python使用random生成随机数 下面是主要函数random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0random.randint(a, b)生成的 ...

  4. 追MM与设计模式

    1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基就是生产鸡翅 ...

  5. django 建立一个简单的应用

    本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...

  6. Django render函数

    render() 此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象. 通俗的讲就是把context的内容, 加载进templates中定义 ...

  7. 1391: [Ceoi2008]order

    有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 Input 第一行给出 N,M( ...

  8. 【LOJ】#2497. 「PA 2017」Banany

    题解 一眼就是线段树维护点分树的dfs序嘛 代码debug一年(手动再见) 码力直线下降,坐等滚粗= = 很明显的我们需要一个点分树,然后求出以每个重心为根的树的dfs序,线段树维护一下每个点的价值- ...

  9. Ionic实战八:ionic登陆页面源码

    onic登陆页面模板源码,可以用于ionic开发中登陆页面制作或者参考 下面是此模板的一些页面 此模板免费提供给大家  登陆用户名和密码都是 phonegap100     

  10. C#.net实现图片上传功能

    C#.NET前台:<asp:Image ID="imgFood" runat="server" /> <asp:FileUpload ID=& ...