跟我学Spring3(6.7): 通知顺序,spring36.7
分享于 点击 24485 次 点评:56
跟我学Spring3(6.7): 通知顺序,spring36.7
如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序。总共有两种情况:同一切面中通知执行顺序、不同切面中的通知执行顺序。
首先让我们看下
1) 同一切面中通知执行顺序:如图6-6所示。
图6-6 同一切面中的通知执行顺序
而如果在同一切面中定义两个相同类型通知(如同是前置通知或环绕通知(proceed之前))并在同一连接点执行时,其执行顺序是未知的,如果确实需要指定执行顺序需要将通知重构到两个切面,然后定义切面的执行顺序。
java代码:
错误“Advice precedence circularity error”:说明AspectJ无法决定通知的执行顺序,只要将通知方法分类并按照顺序排列即可解决。
2)不同切面中的通知执行顺序:当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。
如果需要他们顺序执行,可以通过指定切面的优先级来控制通知的执行顺序。
Spring中可以通过在切面实现类上实现org.springframework.core.Ordered接口或使用Order注解来指定切面优先级。在多个切面中,Ordered.getValue()方法返回值(或者注解值)较小值的那个切面拥有较高优先级,如图6-7所示。
在此我们不推荐使用实现Ordered接口方法,所以没介绍,示例代码在cn.javass.spring.chapter6. OrderAopTest文件中。
本系列:
- 跟我学 Spring 3(1): Spring 概述
- 跟我学 Spring 3(2.1):IoC 基础
- 跟我学Spring3(2.2):IoC容器基本原理
- 跟我学Spring3(2.3):IoC容器基本原理
- 跟我学Spring3(3.1):DI的配置使用
- 跟我学Spring3(3.2):DI之循环依赖
- 跟我学Spring3(3.3):更多的DI知识
- 跟我学Spring3(3.4):DI之Bean的作用域
- 跟我学Spring3(4.1):资源之基础知识
- 跟我学Spring3(4.2):内置Resources实现
- 跟我学Spring3(4.3):访问Resource
- 跟我学Spring3(4.4):Resource通配符路径
- 跟我学Spring3(5.1 & 5.2):Spring表达式语言之概述和SpEL基础
- 跟我学Spring3(5.3):Spring 表达式语言之 SpEL 语法
- 跟我学Spring3(5.4):在Bean定义中使用EL—跟我学spring3
- 跟我学Spring3(6.1):AOP的HelloWorld
- 跟我学Spring3(6.3):基于Schema的AOP
- 跟我学Spring3(6.5):AspectJ切入点语法详解
- 跟我学Spring3(6.6): 通知参数
- 跟我学Spring3(6.7): 通知顺序
用户点评