news 2026/1/16 6:08:10

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/1/10 6:38:34

电子电路基础快速理解:电功率计算核心要点

电功率计算:从零理解电路中的“能耗真相” 你有没有遇到过这种情况——电路明明接对了,元件参数也查过了,可通电没多久,某个电阻就发烫冒烟?或者你的电池供电设备续航远低于预期,反复检查代码也没发现问题&…

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

电源管理PCB设计:操作指南降低噪声耦合风险

电源管理PCB设计实战:如何根治噪声耦合顽疾你有没有遇到过这样的问题?系统上电后,ADC采样数据跳动不止,时钟抖动超标,或者FPGA莫名其妙复位。示波器一探,发现电源轨上爬满了“毛刺”——高频振铃、周期性纹…

作者头像 李华
网站建设 2025/12/31 11:26:20

25、PsExec工具使用全解析

PsExec工具使用全解析 1. 程序路径与执行基础规则 当使用PsExec命令行时,如果“program”部分仅指定文件名,该文件必须存在于远程系统的Path环境变量中。需要注意的是,对全局PATH环境变量所做的更改通常要在系统重启后,服务才能识别到。 若“program”参数指定的是绝对路…

作者头像 李华
网站建设 2026/1/1 3:22:17

30、进程与诊断实用工具使用指南

进程与诊断实用工具使用指南 1. VMMap 文本查找与复制 在 VMMap 的详细视图中查找特定文本,可按 Ctrl+F 组合键。查找功能会选中详细视图中包含你指定文本的下一个可见行,文本可位于任意列。需注意,它不会在未展开的子块中搜索文本。若要重复上一次搜索,按 F3 键即可…

作者头像 李华
网站建设 2026/1/7 13:06:53

外包干了6天,技术明显退步。。。

我是一名大专生,自20年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近5年的光阴。今年9月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

作者头像 李华