tlias智能学习辅助系统--SpringAOP-进阶-通知顺序

目录

[一、默认执行顺序(无 @Order 注解时)](#一、默认执行顺序(无 @Order 注解时))

[二、使用 @Order 注解自定义顺序](#二、使用 @Order 注解自定义顺序)

三、代码示例

四、执行结果示例


@Order不设置的话是有默认值的

当有多个切面(Aspect)的切入点(Pointcut)都匹配到同一个目标方法时,在目标方法运行期间,这些切面中的通知(Advice)都会被执行。其执行顺序遵循以下规则:


一、默认执行顺序(无 @Order 注解时)

不同切面类中,默认按照切面类的类名按字母顺序排序

  • 前置通知(@Before):类名字母靠前的切面,先执行。
  • 后置通知(@After / @AfterReturning) :类名字母靠前的切面,后执行

🔍 示例:

假设有两个切面类:

  • MyAspect2
  • MyAspect3

按类名字母排序:MyAspect2 < MyAspect3

所以:

  • @Before 通知执行顺序:MyAspect2 先执行,MyAspect3 后执行
  • @After 通知执行顺序:MyAspect3 先执行,MyAspect2 后执行(逆序)

二、使用 @Order 注解自定义顺序

可以通过在切面类上添加 @Order(数字) 注解来显式控制执行顺序。

java 复制代码
@Order(数字)
@Component
@Aspect
public class XxxAspect { ... }
  • 数字越小,优先级越高。
  • 前置通知(@Before)@Order 值小的切面先执行。
  • 后置通知(@After)@Order 值小的切面后执行

✅ 示例:

  • @Order(1) 的切面 A
  • @Order(5) 的切面 B

则:

  • @Before 执行顺序:A → B(数字小的先)
  • @After 执行顺序:B → A(数字小的后)

三、代码示例

java 复制代码
// MyAspect2.java
@Order(1)
@Component
@Aspect
@Slf4j
public class MyAspect2 {

    @Before("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void before() {
        log.info("before... 2");
    }

    @After("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void after() {
        log.info("after... 2");
    }
}
java 复制代码
// MyAspect3.java
@Order(5)
@Component
@Aspect
@Slf4j
public class MyAspect3 {

    @Before("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void before() {
        log.info("before... 3");
    }

    @After("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void after() {
        log.info("after... 3");
    }
}

四、执行结果示例

调用目标方法时,输出日志顺序为:

java 复制代码
before... 2     // @Order(1) 的 @Before 先执行
before... 3     // @Order(5) 的 @Before 后执行
【目标方法执行】
after... 3      // @Order(5) 的 @After 先执行
after... 2      // @Order(1) 的 @After 后执行

总结口诀

  • 前置通知:Order 小的先执行(越小越"前")
  • 后置通知:Order 小的后执行(越小越"后")
相关推荐
再让我睡两分钟13 小时前
【无标题】
android·java·数据库·人工智能·prompt·ai应用开发
折哥的程序人生 · 物流技术专研14 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:工厂方法 vs 抽象工厂 —— 从单产品到产品族,架构如何演进?
java·spring·java面试·抽象工厂·工厂方法·java设计模式·从踩坑到精通
砍材农夫14 小时前
spring|spring event|Spring内置事件驱动编程模型
java·数据库·spring
卷福同学14 小时前
AI编程出海第一步:别急着写代码,先找到老外真正愿意付费的需求
人工智能·后端·面试
wuqingshun31415915 小时前
RabbitMQ 中无法路由的消息会去到哪里?
java
北冥you鱼15 小时前
Go-Ethereum (Geth) 最佳实践:从部署到生产环境优化
开发语言·后端·golang
thefool11226616 小时前
Java 方法重载
java
程序员爱钓鱼17 小时前
Rust 函数与返回值详解:参数、表达式与返回类型
后端·rust
这不小天嘛1 天前
JAVA八股——J集合篇
java·开发语言
什巳1 天前
JAVA练习278- 和为 K 的子数组
java·学习·算法·leetcode