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

Posted zjrodger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原不定义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类”和“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属性,通过切面类的定义顺序来决定通知执行的先后顺序的主要内容,如果未能解决你的问题,请参考以下文章

3.25 切面发布-通知顺序-@Order

MyBatis实体属性与表的字段不对应的解决方案

非springboot的注解调用,请问通过啥样的注解可以决定接口的实现类加载顺序?

spring @Order标记

Method Resolve Order (MRO) - 类对象属性的解析顺序

Spring之面向切面编程指定切面执行顺序