news 2026/5/12 14:54:35

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot AOP (四)与事务、异常处理交互
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/CSDN自动化运营脚本 有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

文章目录

  • Spring Boot AOP (四)与事务、异常处理交互
    • 1. 引言
    • 2. @Transactional 与 AOP 结合
      • 2.1 核心机制
      • 2.2 示例代码
    • 3. AOP 与事务执行顺序
      • Mermaid 流程图:AOP + 事务 + 异常
    • 4. 异常通知与事务交互
      • 4.1 异常通知触发条件
      • 4.2 示例
    • 5. 方法调用顺序示意图
    • 6. 多切面 + 异常 + 事务组合
      • 执行顺序示意
    • 7. 小结
    • 结束语


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

1. 引言

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

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


2. @Transactional 与 AOP 结合

2.1 核心机制

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

2.2 示例代码

@ServicepublicclassUserService{@TransactionalpublicvoidcreateUser(Stringname){System.out.println("创建用户: "+name);if(name.equals("error")){thrownewRuntimeException("模拟异常");}}}@Aspect@ComponentpublicclassLoggingAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidlogBefore(JoinPointjp){System.out.println("日志前置: "+jp.getSignature());}@AfterReturning("execution(* com.example.service..*.*(..))")publicvoidlogAfter(JoinPointjp){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@ComponentpublicclassExceptionAspect{@AfterThrowing(pointcut="execution(* com.example.service..*.*(..))",throwing="ex")publicvoidlogException(JoinPointjp,Throwableex){System.out.println("捕获异常: "+ex.getMessage()+" 方法: "+jp.getSignature());}}

5. 方法调用顺序示意图

ClientProxyTransactionInterceptorLoggingAspectTarget调用 createUser("Tom")@Before开启事务执行目标方法返回/异常提交或回滚事务@AfterReturning / @AfterThrowing返回结果ClientProxyTransactionInterceptorLoggingAspectTarget

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

@Aspect@Component@Order(1)publicclassLoggingAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidbefore(JoinPointjp){System.out.println("日志前置");}}@Aspect@Component@Order(2)publicclassTransactionAspect{@Around("execution(* com.example.service..*.*(..))")publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{System.out.println("事务开始");try{Objectresult=pjp.proceed();System.out.println("事务提交");returnresult;}catch(Throwableex){System.out.println("事务回滚");throwex;}}}@Aspect@Component@Order(3)publicclassMetricsAspect{@AfterReturning("execution(* com.example.service..*.*(..))")publicvoidafterReturning(JoinPointjp){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 图直观展示了多切面 + 事务 + 异常的方法调用链
  • 理解这个顺序有助于正确设计日志、事务、异常切面,避免回滚异常被切面吞掉或日志记录错位

结束语


👨‍💻 关于我

持续学习 | 追求真我

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

感谢订阅专栏 三连文章

掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner

专栏简介
📊 一图读懂系列图文并茂,轻松理解复杂概念
📝 一文读懂系列深入浅出,全面解析技术要点
🌟持续更新保持学习,不断进步
🎯 人生经验经验分享,共同成长

你好,我是Qiuner.为帮助别人少走弯路而写博客

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.

上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 14:54:35

为什么说Anything-LLM是未来知识管理的标准配置?

为什么说 Anything-LLM 是未来知识管理的标准配置? 在企业知识库越积越厚、员工信息过载日益严重的今天,一个新入职的员工要花多久才能搞清楚“年假怎么算”?翻三份PDF、问两个老同事、再确认一遍HR邮件——这还是效率高的情况。而与此同时&a…

作者头像 李华
网站建设 2026/5/10 7:27:18

从零实现8位微控制器核心:VHDL项目完整示例

亲手造一颗CPU:用VHDL从零搭建8位微控制器核心你有没有想过,电脑里那颗飞速运转的“大脑”——CPU,到底是怎么工作的?它如何读懂一条条指令、完成加减运算、控制程序跳转?与其看别人画的框图猜来猜去,不如自…

作者头像 李华
网站建设 2026/5/5 4:40:52

26、深入了解 Windows 系统管理工具

深入了解 Windows 系统管理工具 1. 工具概述 在 Windows 系统管理中,有一系列实用的工具可以帮助我们完成各种任务,如管理文件、获取安全标识符、收集系统信息、终止进程、查看进程信息以及了解用户登录情况等。下面将详细介绍这些工具的功能和使用方法。 2. PsFile 2.1 …

作者头像 李华
网站建设 2026/5/5 16:22:35

29、VMMap:强大的内存分析工具使用指南

VMMap:强大的内存分析工具使用指南 1. VMMap的启动与追踪 VMMap在启动时会将一个DLL注入到目标进程中,并拦截其虚拟内存API调用。它会捕获内存分配的类型、大小、内存保护以及分配时的调用栈信息。在64位Windows系统中,VMMap可以对x86和x64程序进行检测和追踪,并相应地启…

作者头像 李华
网站建设 2026/5/1 6:50:44

34、SigCheck工具使用指南:文件扫描、签名验证与安全分析

SigCheck工具使用指南:文件扫描、签名验证与安全分析 1. 证书列表参数说明 SigCheck提供了一系列用于列出证书的参数,具体如下: | 参数 | 描述 | | — | — | | -t | 列出指定计算机证书存储中的证书(默认是所有计算机存储) | | -tu | 与 -t 相同,但列出用户证书存…

作者头像 李华
网站建设 2026/5/1 7:08:45

AI时代你不拥抱它,就得不到它的爱,信不信由你

AI时代你不拥抱它,就得不到它的爱,信不信由你 凌晨三点,你还在与一段顽固的代码搏斗,而隔壁工位的老王,早已用AI生成完整模块,正悠然地刷着短视频——这,就是拥抱与否的残酷分野。 一、幻想与现…

作者头像 李华