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 小的后执行(越小越"后")
相关推荐
元Y亨H24 分钟前
Nacos - 服务发现
java·微服务
麦聪聊数据33 分钟前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
微露清风35 分钟前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi022736 分钟前
Java趣闻
java
码事漫谈1 小时前
AI 技能工程入门:从独立能力到协作生态
后端
码事漫谈1 小时前
构建高并发AI服务网关:C++与gRPC的工程实践
后端
阿波罗尼亚1 小时前
Tcp SSE Utils
android·java·tcp/ip
susu10830189111 小时前
springboot3.5.8整合minio8.5.9
java·springboot
不知道累,只知道类2 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
myzshare2 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序