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

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

文章目录


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(String name){System.out.println("创建用户: "+ name);if(name.equals("error")){thrownewRuntimeException("模拟异常");}}}@Aspect@ComponentpublicclassLoggingAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidlogBefore(JoinPoint jp){System.out.println("日志前置: "+ jp.getSignature());}@AfterReturning("execution(* com.example.service..*.*(..))")publicvoidlogAfter(JoinPoint jp){System.out.println("日志后置: "+ jp.getSignature());}}

3. AOP 与事务执行顺序

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

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

正常返回

异常抛出

方法调用

LoggingAspect @Before

TransactionInterceptor @Around 前开启事务

执行目标方法

TransactionInterceptor 提交事务

TransactionInterceptor 回滚事务

LoggingAspect @AfterReturning

LoggingAspect @AfterThrowing

返回客户端


4. 异常通知与事务交互

4.1 异常通知触发条件

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

4.2 示例

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

5. 方法调用顺序示意图

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


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

@Aspect@Component@Order(1)publicclassLoggingAspect{@Before("execution(* com.example.service..*.*(..))")publicvoidbefore(JoinPoint jp){System.out.println("日志前置");}}@Aspect@Component@Order(2)publicclassTransactionAspect{@Around("execution(* com.example.service..*.*(..))")publicObjectaround(ProceedingJoinPoint pjp)throwsThrowable{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)publicclassMetricsAspect{@AfterReturning("execution(* com.example.service..*.*(..))")publicvoidafterReturning(JoinPoint jp){System.out.println("性能监控");}}

执行顺序示意

正常

异常

方法调用

LoggingAspect @Before

TransactionAspect @Around 前

目标方法执行

TransactionAspect 提交事务

TransactionAspect 回滚事务

MetricsAspect @AfterReturning

异常处理切面执行

返回客户端


7. 小结

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

结束语

👨‍💻 关于我

持续学习 | 追求真我

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

感谢订阅专栏 三连文章

image-20251011155556997

掘金点击访问QiunerZEEKLOG点击访问QiunerGitHub点击访问QiunerGitee点击访问Qiuner

专栏简介
📊 一图读懂系列图文并茂,轻松理解复杂概念
📝 一文读懂系列深入浅出,全面解析技术要点
🌟持续更新保持学习,不断进步
🎯 人生经验经验分享,共同成长
你好,我是Qiuner. 为帮助别人少走弯路而写博客

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

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

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。ZEEKLOG评论区和私信消息看不完 掘金消息少一点.
上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

Read more

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——用户管理、商品列表、购物车

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——用户管理、商品列表、购物车

《鸿蒙APP开发从入门到精通》第13篇:鸿蒙电商购物车全栈项目——用户管理、商品列表、购物车 🛒📱 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第13篇——用户管理、商品列表、购物车篇,100%承接第12篇的「运维监控、生态运营与专属变现」项目架构,完成鸿蒙电商购物车全栈项目的基础功能实现。 学习目标: * 掌握用户管理的设计与实现; * 实现用户注册、登录、用户信息管理; * 理解商品列表的设计与实现; * 实现商品列表、商品详情、商品搜索; * 掌握购物车管理的设计与实现; * 实现添加商品到购物车、修改购物车商品数量、删除购物车商品; * 优化用户管理、商品列表、购物车的用户体验(响应速度、数据安全、用户反馈)。 学习重点: * 鸿蒙APP用户管理的开发流程; * 用户管理的分类与使用场景; * 商品列表的设计与实现; * 购物车管理的设计与实现。 一、 用户管理基础 🎯 1.1 用户管理定义 用户管理是指对应用的用户进行管理,主要包括以下方面:

By Ne0inhk
Flutter for OpenHarmony:checks 下一代测试断言库(Fluent API,更易读的测试报告) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:checks 下一代测试断言库(Fluent API,更易读的测试报告) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 如果你写过 Dart/Flutter 测试,你一定熟悉 flutter_test 中的 expect(actual, matcher) 语法。 这套语法虽然经典,但有几个缺点: 1. 阅读不直观:expect(user.age, greaterThan(18)) 读起来像 Yoda code。 2. 自动补全弱:IDE 不知道 user.age 是 int,所以不会智能提示 greaterThan。 3. 错误信息有时含糊:只能报 “Expected: >18, Actual: 10”,难以展示复杂对象的差异。 checks

By Ne0inhk
Flutter 三方库 hooks_runner 的鸿蒙化适配指南 - 实现声明式的生命周期 Hook 任务管理、支持端侧自动化脚本触发与执行流精准编排实战

Flutter 三方库 hooks_runner 的鸿蒙化适配指南 - 实现声明式的生命周期 Hook 任务管理、支持端侧自动化脚本触发与执行流精准编排实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 hooks_runner 的鸿蒙化适配指南 - 实现声明式的生命周期 Hook 任务管理、支持端侧自动化脚本触发与执行流精准编排实战 前言 在进行 Flutter for OpenHarmony 的自动化工具、CI/CD 插件或具备高度动态逻辑的业务系统开发时,如何有序、可控地执行一系列相互依赖的“任务钩子(Hooks)”?hooks_runner 是一个专为任务生命周期编排设计的轻量级引擎。它能将离散的函数逻辑拆解并组装成一条健壮的执行流水线。本文将介绍如何在鸿蒙端利用该库构建极致的任务执行闭环。 一、原理解析 / 概念介绍 1.1 基础原理 hooks_runner 采用了“注册-触发(Register & Trigger)”模式。它允许开发者在不同的生命周期阶段(如 pre_

By Ne0inhk
做鸿蒙 App 一个月:10 个 ArkUI 大坑

做鸿蒙 App 一个月:10 个 ArkUI 大坑

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

By Ne0inhk