news 2025/12/24 1:58:42

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 1:58:18

高速PCB布局布线实战案例(Altium Designer实现)

高速PCB设计实战:从DDR3接口到Altium Designer的深度落地你有没有遇到过这样的情况——电路板焊接完成,上电后FPGA和DDR3就是“对不上眼”,数据读写频繁出错?示波器一测,DQS信号采样窗口缩得像条缝,时序裕量…

作者头像 李华
网站建设 2025/12/24 1:57:19

新手友好型AI平台:Anything-LLM安装配置图文教程

新手友好型AI平台:Anything-LLM安装配置图文教程 在当今信息爆炸的时代,我们每天都在与大量文档打交道——合同、报告、技术手册、学习资料……但真正能被“激活”的知识却少之又少。你是否曾为查找某个条款翻遍几十页PDF?是否希望大模型不仅…

作者头像 李华
网站建设 2025/12/24 1:56:16

降低AI使用门槛:Anything-LLM对非技术人员有多友好?

降低AI使用门槛:Anything-LLM对非技术人员有多友好? 在今天,几乎每个人都听说过“大模型”和“AI助手”。但如果你不是程序员、不懂机器学习、甚至对命令行都有点发怵——你真的能用上这些前沿技术吗?还是说,它们依然…

作者头像 李华
网站建设 2025/12/24 1:56:03

19、深入了解系统监控:Procmon 实用指南

深入了解系统监控:Procmon 实用指南 1. 过滤与高级输出 在系统监控中,Procmon 提供了多种过滤选项,以帮助用户聚焦于特定的系统活动。以下这些低级别操作通常会被默认过滤: - 名称以 IRP_MJ_ 开头的操作,这些是 Windows 驱动用于文件或设备 I/O、即插即用(PnP)、电…

作者头像 李华
网站建设 2025/12/24 1:56:02

20、进程监视器(Process Monitor)使用指南

进程监视器(Process Monitor)使用指南 1. 查看堆栈跟踪符号 若要查看堆栈跟踪中的符号,捕获跟踪的系统无需安装调试工具或配置符号,但查看跟踪的系统必须同时具备这两者。此外,该系统还必须能够访问跟踪系统的符号文件和二进制文件。对于 Windows 文件,Microsoft 公共符…

作者头像 李华
网站建设 2025/12/24 1:55:57

23、ProcDump 使用指南:异常监控与转储文件选项详解

ProcDump 使用指南:异常监控与转储文件选项详解 1. 异常监控 异常信息比 ProcDump 支持的其他标准相关信息丰富得多。当基于内存阈值进行过滤时,问题很简单:“是否超过阈值?”答案只有“是”或“否”。而异常包含的细节远不止“发生了异常”这么简单。 需要注意的是,将…

作者头像 李华