SpringBoot -- AOP多个切面织入同时织入一个方法时的执行顺序

博客围绕基于AOP拦截controller入参记录日志和自定义注解校验参数时遇到的问题展开,探讨两个或多个AOP同时作用于同一方法的执行顺序。介绍了设定顺序的三种方式,经实验确定order越小越先执行且先执行的最后结束,还提及不同情况下的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在做基于aop的拦截controller入参并记录日志和基于aop的自定义注解来实现校验参数这两个功能时遇到了这个问题,就是当两个或多个aop同时作用于同一个方法时的执行顺序是什么。答案是,根据这个切面的设定顺序,这个设定的顺序越小则越先执行,目前设定顺序主要有三种方式:

  1. 实现org.springframework.core.Ordered接口,重写getOrder方法。
@Component  
@Aspect
public class MessageQueueAopAspect implements Ordered{
	@Override  
    public int getOrder() {  
        // TODO Auto-generated method stub  
        return 2;  
    }  
      
}  
  1. 使用order注解指定顺序。
@Component  
@Aspect
@Order(1)  
public class MessageQueueAopAspect1{  
      
    ...  
}  
  1. 通过配置文件配置设定顺序。
<aop:config expose-proxy="true">  
    <aop:aspect ref="aopBean" order="0">    
        <aop:pointcut id="testPointcut"  expression="@annotation(xxx.xxx.xxx.annotation.xxx)"/>    
        <aop:around pointcut-ref="testPointcut" method="doAround" />    
        </aop:aspect>    
</aop:config>  

  经实验确定,确实是order越小越是最先执行,但更重要的是最先执行的最后结束。下面我们通过看一个图会更直观:
在这里插入图片描述
  Spring aop就是一个同心圆,要执行的方法为圆心,最外层的order最小。从最外层按照AOP1、AOP2的顺序依次执行doAround方法,doBefore方法。然后执行method方法,最后按照AOP2、AOP1的顺序依次执行doAfter、doAfterReturn方法。也就是说对多个AOP来说,先before的,一定后after。
  然后下面两个更清晰些:

  1. 同一aspect,不同advice的执行顺序
    在这里插入图片描述
  2. 不同aspect,advice的执行顺序
    在这里插入图片描述
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值