Spring Boot AOP与事务、异常处理交互的问题小结

 更新时间:2025年12月24日 09:00:05   作者:Qiuner  
文章介绍了Spring Boot中AOP与事务、异常处理的交互,包括@Transactional注解的处理机制、事务与AOP的结合、切面执行顺序以及异常通知与事务的交互,通过示例和流程图,详细说明了在多切面环境下,通知的执行顺序及其实现原理,感兴趣的朋友跟随小编一起看看吧

Spring Boot AOP (四)与事务、异常处理交互

1. 引言

在企业项目中,AOP 不仅用于日志和性能监控,还与 事务管理异常处理 密切相关。理解 AOP、事务、异常三者的执行顺序 对架构设计和问题排查至关重要。

Spring 事务是通过 AOP 代理实现的,@Transactional 注解会生成一个事务切面,织入目标方法。

2. @Transactional 与 AOP 结合

2.1 核心机制

  1. @Transactional 注解会被 TransactionInterceptor 处理
  2. Spring 使用 环绕通知(Around Advice)在方法调用前开启事务,方法执行后提交或回滚事务
  3. 如果目标方法抛出异常,事务回滚策略生效

2.2 示例代码

@Service
public class UserService {
    @Transactional
    public void createUser(String name) {
        System.out.println("创建用户: " + name);
        if (name.equals("error")) {
            throw new RuntimeException("模拟异常");
        }
    }
}
@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service..*.*(..))")
    public void logBefore(JoinPoint jp) {
        System.out.println("日志前置: " + jp.getSignature());
    }
    @AfterReturning("execution(* com.example.service..*.*(..))")
    public void logAfter(JoinPoint jp) {
        System.out.println("日志后置: " + jp.getSignature());
    }
}

3. AOP 与事务执行顺序

切面类型执行时机
LoggingAspect@Before方法执行前
TransactionInterceptor@Around方法执行前开启事务
目标方法-执行业务逻辑
TransactionInterceptor@Around方法执行后提交或回滚事务
LoggingAspect@AfterReturning / @AfterThrowing方法返回后执行日志/异常记录

Mermaid 流程图:AOP + 事务 + 异常

flowchart TD
    A[方法调用] --> B[LoggingAspect @Before]
    B --> C[TransactionInterceptor @Around 前开启事务]
    C --> D[执行目标方法]
    D -->|正常返回| E[TransactionInterceptor 提交事务]
    D -->|异常抛出| F[TransactionInterceptor 回滚事务]
    E --> G[LoggingAspect @AfterReturning]
    F --> H[LoggingAspect @AfterThrowing]
    G --> I[返回客户端]
    H --> I

4. 异常通知与事务交互

4.1 异常通知触发条件

  • @AfterThrowing 仅在目标方法抛出异常时执行
  • @AfterReturning 仅在方法正常返回时执行
  • @After 无论成功或异常都会执行

4.2 示例

@Aspect
@Component
public class ExceptionAspect {
    @AfterThrowing(pointcut = "execution(* com.example.service..*.*(..))", throwing = "ex")
    public void logException(JoinPoint jp, Throwable ex) {
        System.out.println("捕获异常: " + ex.getMessage() + " 方法: " + jp.getSignature());
    }
}

5. 方法调用顺序示意图

6. 多切面 + 异常 + 事务组合

@Aspect
@Component
@Order(1)
public class LoggingAspect {
    @Before("execution(* com.example.service..*.*(..))")
    public void before(JoinPoint jp) { System.out.println("日志前置"); }
}
@Aspect
@Component
@Order(2)
public class TransactionAspect {
    @Around("execution(* com.example.service..*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("事务开始");
        try {
            Object result = pjp.proceed();
            System.out.println("事务提交");
            return result;
        } catch (Throwable ex) {
            System.out.println("事务回滚");
            throw ex;
        }
    }
}
@Aspect
@Component
@Order(3)
public class MetricsAspect {
    @AfterReturning("execution(* com.example.service..*.*(..))")
    public void afterReturning(JoinPoint jp) { System.out.println("性能监控"); }
}

执行顺序示意

flowchart TD
    A[方法调用] --> B[LoggingAspect @Before]
    B --> C[TransactionAspect @Around 前]
    C --> D[目标方法执行]
    D -->|正常| E[TransactionAspect 提交事务]
    D -->|异常| F[TransactionAspect 回滚事务]
    E --> G[MetricsAspect @AfterReturning]
    F --> H[异常处理切面执行]
    G --> I[返回客户端]
    H --> I

7. 小结

  • Spring 事务基于 AOP 环绕通知实现
  • 异常通知和事务回滚紧密关联
  • 多切面情况下,通知顺序由 @OrderOrdered 控制
  • Mermaid 图直观展示了 多切面 + 事务 + 异常 的方法调用链
  • 理解这个顺序有助于正确设计日志、事务、异常切面,避免回滚异常被切面吞掉或日志记录错位

到此这篇关于Spring Boot AOP与事务、异常处理交互的问题小结的文章就介绍到这了,更多相关Spring Boot AOP事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多态(动力节点Java学院整理)

    Java多态(动力节点Java学院整理)

    多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。接下来通过本文给大家介绍java多态相关知识,感兴趣的朋友一起学习吧
    2017-04-04
  • Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整。那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我的理解和实践建议
    2021-05-05
  • Java Condition类案例详解

    Java Condition类案例详解

    这篇文章主要介绍了Java Condition类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • springboot pom文件加入监控依赖后没有起作用的解决

    springboot pom文件加入监控依赖后没有起作用的解决

    这篇文章主要介绍了springboot pom文件加入监控依赖后没有起作用的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java微信公众平台开发(8) 多媒体消息回复

    Java微信公众平台开发(8) 多媒体消息回复

    这篇文章主要为大家详细介绍了Java微信公众平台开发第八步,微信多媒体消息回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringBoot上传下载文件+oss实例

    SpringBoot上传下载文件+oss实例

    这篇文章主要介绍了SpringBoot上传下载文件+oss实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java新特性之Nashorn_动力节点Java学院整理

    Java新特性之Nashorn_动力节点Java学院整理

    这篇文章主要介绍了Java新特性之Nashorn的相关资料,需要的朋友可以参考下
    2017-06-06
  • spring security的BCryptPasswordEncoder加密和对密码验证的原理分析

    spring security的BCryptPasswordEncoder加密和对密码验证的原理分析

    文章介绍了加密算法和hash算法的基本概念,以及BCryptPasswordEncoder加密和解密的原理,加密算法是可逆的,需要加盐以保证安全性,BCryptPasswordEncoder通过生成盐值并在加密和解密过程中使用,确保相同的明文每次加密结果不同,从而提高安全性
    2024-11-11
  • java开发分布式服务框架Dubbo服务引用过程详解

    java开发分布式服务框架Dubbo服务引用过程详解

    这篇文章主要为大家介绍了java开发分布式服务框架Dubbo服务引用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Spring Boot 整合 MongoDB的示例

    Spring Boot 整合 MongoDB的示例

    这篇文章主要介绍了Spring Boot 整合 MongoDB的示例,帮助大家更好的理解和学习spring boot框架,感兴趣的朋友可以了解下
    2020-10-10

最新评论