【第六章】 AOP 之 6.7 通知顺序 ——跟我学spring3
2016-05-11 15:31
363 查看
转自:http://sishuok.com/forum/blogPost/list/2474.html
如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?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所示。
图6-7 两个切面指定了优先级
对于@AspectJ风格和注解风格可分别用以下形式指定优先级:
在此我们不推荐使用实现Ordered接口方法,所以没介绍,示例代码在cn.javass.spring.chapter6. OrderAopTest文件中。
如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?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所示。
图6-7 两个切面指定了优先级
对于@AspectJ风格和注解风格可分别用以下形式指定优先级:
在此我们不推荐使用实现Ordered接口方法,所以没介绍,示例代码在cn.javass.spring.chapter6. OrderAopTest文件中。
相关文章推荐
- java中的移位运算符:<<,>>,>>>总结
- eclipse 导入工程出现问题:JRE System Libreary[jre1.6.0_05](unbound)
- java.lang.NoClassDefFoundError 异常解读
- java.lang.NoClassDefFoundError 异常解读
- StrutsPrepareAndExecuteFilter的作用
- 常用的Java Date 方法
- Java基础第五天_静态代码块、类的继承和接口
- 【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3
- java算法 -- zip解压,压缩
- MS Office2010、WPS2015、OpenOffice4用Java将Office文档转换为PDF,WIN7 64位系统
- 深入浅出RxJava——响应式的好处
- eclipse提示db-record doesn't exist
- Java从后台重定向(redirect)到另一个项目的方法
- weblogic打补丁修复JAVA反序列化漏洞
- Java 设计模式(十三) 接口隔离原则(ISP)
- 多线程05:《疯狂Java讲义》学习笔记——线程同步
- JNI字段描述符“([Ljava/lang/String;)V”
- Java基本数据类型
- java RandomAccessFile类
- 二叉树操作(Java语言)