一. 多切面类默认执行顺序
在 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 { ... }
⚠️ 注意
-
只对 当前连接点匹配到的切面 有效;没有匹配的不参与排序。
-
数字越小,越靠近目标方法,也就是:
AuogAspect(1) → DicAspect(2) → 目标方法 → DicAspect → AuogAspect
所以 日志切面通常放最外层(数字最小),才能记录到真正的“总耗时”。并且进入和离开切面的顺序相反。 -
如果用了
@Async等线程切换,AOP 顺序只在同一线程内保证。
✅ 结论
给你两个切面都加上 @Order(或 Ordered),明确数值,不要再依赖类名。
推荐:
| 切面 | 顺序 | 说明 |
|---|---|---|
| AuogAspect | 1 | 最外层,先进入后退出,可记总耗时 |
| DicAspect | 2 | 内层,对返回结果做字典翻译 |
Spring AOP切面执行顺序解析
5146

被折叠的 条评论
为什么被折叠?



