Spring AOP切面执行顺序

Spring AOP切面执行顺序解析

一. 多切面类默认执行顺序

在 Spring AOP 里,“同一个连接点” 上如果匹配了多个 @Aspect,它们会以 “类名字母升序” 作为默认顺序调用。比如定义了两个切面类AuogAspect 和 DicAspect。项目在执行这两个切面类时,就是按照先执行AuogAspect → 后执行DicAspect ,即 A < D 的顺序。

@Aspect
@Component
public class AuogAspect {

    @Pointcut("@annotation(org.jeecg.modules.annotation.Auog)")
    public void lPointCut() {

    }

    @Around("lPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
    	......
        Object result = pjp.proceed();
        ......
        return result;
    }




@Aspect
@Component
@Slf4j
public class DicAspect {

    /**
     * 定义切点Pointcut
     */
    @Pointcut("execution(public * org.jeecg.modules.*.controller.*Controller.*(..)))
    public void service() {
    }

    @Around("service()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    	......
        Object result = pjp.proceed();
        ......
        return result;
    }

二. 多切面类自定义执行顺序


如果你想 显式、可维护地 规定谁先谁后,不要用类名拼音,用 Spring 提供的机制:

✅ 官方做法:实现 Ordered 接口或用 @Order

方式 1:实现 Ordered 接口
@Aspect
@Component
public class AuogAspect implements Ordered {
    @Override
    public int getOrder() {
        return 1;   // 数字越小越先执行
    }
}

@Aspect
@Component
public class DicAspect implements Ordered {
    @Override
    public int getOrder() {
        return 2;   // 后执行
    }
}
方式 2:直接注解
@Aspect
@Component
@Order(1)   // 先执行
public class AuogAspect { ... }

@Aspect
@Component
@Order(2)   // 后执行
public class DicAspect { ... }

⚠️ 注意

  1. 只对 当前连接点匹配到的切面 有效;没有匹配的不参与排序。

  2. 数字越小,越靠近目标方法,也就是:
    AuogAspect(1) → DicAspect(2) → 目标方法 → DicAspect → AuogAspect
    所以 日志切面通常放最外层(数字最小),才能记录到真正的“总耗时”。并且进入和离开切面的顺序相反。

  3. 如果用了 @Async 等线程切换,AOP 顺序只在同一线程内保证。

✅ 结论

给你两个切面都加上 @Order(或 Ordered),明确数值,不要再依赖类名。
推荐:

切面顺序说明
AuogAspect1最外层,先进入后退出,可记总耗时
DicAspect2内层,对返回结果做字典翻译

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值