news 2026/3/1 10:24:05

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/2/28 6:59:12

21、进程监控与转储工具深度解析

进程监控与转储工具深度解析 在计算机系统的调试和性能优化过程中,进程监控和转储工具起着至关重要的作用。它们能够帮助开发者和系统管理员深入了解系统的运行状态,及时发现并解决潜在的问题。下面将详细介绍一些常用工具及其使用方法。 进程监控工具的使用 在进程监控工…

作者头像 李华
网站建设 2026/2/28 13:33:38

31、DebugView使用指南:全面解析与操作教程

DebugView使用指南:全面解析与操作教程 1. 全局Win32调试输出捕获 在Windows系统中,借助快速用户切换或远程桌面功能,Windows XP和Windows Server 2003的用户常常会登录到非全局会话。而从Windows Vista开始,会话0隔离机制保证了用户不会登录到服务运行的会话中。当Debug…

作者头像 李华
网站建设 2026/2/22 21:01:54

32、进程与诊断实用工具:DebugView 与 LiveKd 全解析

进程与诊断实用工具:DebugView 与 LiveKd 全解析 一、DebugView 代理使用说明 DebugView 是一款强大的工具,其代理的使用有多种方式可灵活配置。 1. 界面显示控制 任务栏图标显示 :在命令行添加 /t 可隐藏代理状态对话框,转而在任务栏通知区域显示图标。当代理未连接…

作者头像 李华
网站建设 2026/2/28 2:04:10

35、安全实用工具介绍

安全实用工具介绍 在当今数字化的时代,保障系统和数据的安全至关重要。本文将详细介绍两款实用的安全工具:SigCheck 和 AccessChk,帮助你更好地管理系统安全。 SigCheck 工具 SigCheck 是一款功能强大的工具,它不仅可以检查文件的数字签名和 VirusTotal 状态,还能列出安…

作者头像 李华
网站建设 2026/2/26 11:44:47

使用这个插件,fiddler抓包直接生成httprunner脚本

har2case可以将.har文件转化成yaml格式或者json格式的httprunner的脚本文件,生成.har格式文件可以借助 fiddler 或 Charles 抓包工具 友情提示: 录制脚本,只是一个过渡,从0到1的一个过渡,如果让你直接写脚本&#xf…

作者头像 李华
网站建设 2026/2/25 4:21:05

如何用Prometheus监控Anything-LLM服务状态?

如何用Prometheus监控Anything-LLM服务状态? 在企业纷纷将大语言模型(LLM)引入知识管理、客户服务和内部协作的今天,一个看似简单的问题却逐渐浮现:我们如何确保这些“聪明”的AI系统不仅功能正常,还能稳定…

作者头像 李华