`
jinnianshilongnian
  • 浏览: 21431876 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404600
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997292
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631162
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257464
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593032
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248918
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847128
Group-logo
跟我学Nginx+Lua开...
浏览量:697981
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780313
社区版块
存档分类
最新评论

【第六章】 AOP 之 6.7 通知顺序 ——跟我学spring3

阅读更多

       如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?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文件中。

 

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2474.html

 

分享到:
评论
2 楼 jinnianshilongnian 2016-06-30  
Crazy_Robin 写道
hi,博主,你好!我在项目中遇到一个aop通知顺序的问题。通过自己实践发现可以通xml配置形式是可以改变执行顺序的,但是通过注解没法改变。同一个切面多个通知没法改变执行顺序。

博客里对于顺序已经说得比较明确了
1 楼 Crazy_Robin 2016-06-29  
hi,博主,你好!我在项目中遇到一个aop通知顺序的问题。通过自己实践发现可以通xml配置形式是可以改变执行顺序的,但是通过注解没法改变。同一个切面多个通知没法改变执行顺序。

相关推荐

Global site tag (gtag.js) - Google Analytics