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 小的后执行(越小越"后")
相关推荐
Java牛马1 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌1 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
SomeB1oody2 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
东小西2 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
Profile排查笔记2 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
xrandzj2 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉3 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
用户938515635073 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
mqiqe3 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情3 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股