同一方法被多个Aspect拦截, 修改切面@Around @Before的执行顺序_疯狂的蜗牛-CSDN博客

今天碰到一个问题,两个切面切了同一个方法,advice分别为 before和around,我要实现的逻辑是@before注解的方法先执行,再执行@Around注解的方法。

奇怪的问题是,在本地(JDK6)执行的确是先@before后@Around执行的,到服务器上又是先@Around后@before,很奇怪。上网一搜,有相关的与jdk版本有关的说法,未测试,不知道正确与否

网上大多的说法,执行顺序是(正常情况下):

现在需要对同一方法被多个Aspect拦截的执行顺序进行改变,使得切面1的before先执行,再执行切面2的around方法。

方法有两种:

1、实现org.springframework.core.Ordered接口,实现它的getOrder()方法

2、给aspect添加@Order注解,该注解全称为:org.springframework.core.annotation.Order

@Order注解有一个value属性,值越小,优先级越高,先执行。

形如:

@Order(1)@Component@Aspectpublic class Aspect1 {    // ...} @Order(2)@Component@Aspectpublic class Aspect2 {    // ...}

这样修改之后,可保证不管在任何情况下, aspect1 中的 advice 总是比 aspect2 中的 advice 先执行。如下图所示:

其实在日常开发的时候,这种问题还是可以避免的。我幸运的是,刚好两个advice写在不同的切面中,如果两个advice在同一个切面中,又要实现先执行@before再执行@Around,那又怎么办呢?

网上也没有找到相关的解决方案,还是直接把@before中的业务代码移入到@Around中,也是可以解决的。

参考:https://blog.csdn.net/rainbow702/article/details/52185827


原网址: 访问
创建于: 2021-07-06 17:04:31
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论