spring aop的order执行顺序的奇怪现象
以我所知:用注解order可以用来控制aop的执行顺序。则是按照1>2>3这个顺序执行。
但是我这个例子却很奇怪,并不是按照这个顺序执行。
order1这个类,有2个around方式的拦截,一个是拦截注解
,一个是拦截方法
order2这个类,和order1中的拦截方法
,是同一个拦截方式
我理想中的执行顺序,应该是:order1拦截注解
> order1拦截方法
> order2拦截方法
但是实际的执行顺序,却是:order1拦截注解
> order2拦截方法
> order1拦截方法
于是我发现,无论如何设置order,必然都一定是拦截注解
会先执行。
所以这个现象究竟应该如何解释?难道是那个什么先执行的后返回?但是我这里没用到before和after啊
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Spring的AOP执行顺序的参考文档如下:
http://docs.spring.io/spring/...
简单的说,@Aspect注解的Order是起效的,但同一个Aspect中的Advice是没有明确的执行顺序的,例如你Order(1)中的两个Advice.我们看以参考ReflectiveAspectJAdvisorFactory类的源码如下:
我们可以看到,其实Spring也就是按照方法名的对同级别Advice进行排序的.所以,如果想让同级别advice顺序执行,最好的办法就是,方法名按英文字母排列.我的测试代码如下:
执行结果:
----Order1:checkAuthPackage:Execution----
----Order1:checkAuth:Annotation----
但是楼主说的实际执行顺序应该还是不对的,肯定是Order(1)的先执行.
不能使用CGlib 去生成动态代理,使用JDK去生成代理,spring xml配置如下:
之前配置如下Order 不起作用。换成上面的配置就好了.原因还不是很清楚,JDK生成的代理Debug 可以看到advisorArray,这个数组是排序后的advisor