Spring?Boot?AOP與事務、異常處理交互的問題小結
Spring Boot AOP (四)與事務、異常處理交互
1. 引言
在企業(yè)項目中,AOP 不僅用于日志和性能監(jiān)控,還與 事務管理、異常處理 密切相關。理解 AOP、事務、異常三者的執(zhí)行順序 對架構設計和問題排查至關重要。
Spring 事務是通過 AOP 代理實現(xiàn)的,@Transactional 注解會生成一個事務切面,織入目標方法。
2. @Transactional 與 AOP 結合
2.1 核心機制
@Transactional注解會被TransactionInterceptor處理- Spring 使用 環(huán)繞通知(Around Advice)在方法調用前開啟事務,方法執(zhí)行后提交或回滾事務
- 如果目標方法拋出異常,事務回滾策略生效
2.2 示例代碼
@Service
public class UserService {
@Transactional
public void createUser(String name) {
System.out.println("創(chuàng)建用戶: " + name);
if (name.equals("error")) {
throw new RuntimeException("模擬異常");
}
}
}
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service..*.*(..))")
public void logBefore(JoinPoint jp) {
System.out.println("日志前置: " + jp.getSignature());
}
@AfterReturning("execution(* com.example.service..*.*(..))")
public void logAfter(JoinPoint jp) {
System.out.println("日志后置: " + jp.getSignature());
}
}3. AOP 與事務執(zhí)行順序
| 切面 | 類型 | 執(zhí)行時機 |
|---|---|---|
| LoggingAspect | @Before | 方法執(zhí)行前 |
| TransactionInterceptor | @Around | 方法執(zhí)行前開啟事務 |
| 目標方法 | - | 執(zhí)行業(yè)務邏輯 |
| TransactionInterceptor | @Around | 方法執(zhí)行后提交或回滾事務 |
| LoggingAspect | @AfterReturning / @AfterThrowing | 方法返回后執(zhí)行日志/異常記錄 |
Mermaid 流程圖:AOP + 事務 + 異常
flowchart TD
A[方法調用] --> B[LoggingAspect @Before]
B --> C[TransactionInterceptor @Around 前開啟事務]
C --> D[執(zhí)行目標方法]
D -->|正常返回| E[TransactionInterceptor 提交事務]
D -->|異常拋出| F[TransactionInterceptor 回滾事務]
E --> G[LoggingAspect @AfterReturning]
F --> H[LoggingAspect @AfterThrowing]
G --> I[返回客戶端]
H --> I4. 異常通知與事務交互
4.1 異常通知觸發(fā)條件
- @AfterThrowing 僅在目標方法拋出異常時執(zhí)行
- @AfterReturning 僅在方法正常返回時執(zhí)行
- @After 無論成功或異常都會執(zhí)行
4.2 示例
@Aspect
@Component
public class ExceptionAspect {
@AfterThrowing(pointcut = "execution(* com.example.service..*.*(..))", throwing = "ex")
public void logException(JoinPoint jp, Throwable ex) {
System.out.println("捕獲異常: " + ex.getMessage() + " 方法: " + jp.getSignature());
}
}5. 方法調用順序示意圖

6. 多切面 + 異常 + 事務組合
@Aspect
@Component
@Order(1)
public class LoggingAspect {
@Before("execution(* com.example.service..*.*(..))")
public void before(JoinPoint jp) { System.out.println("日志前置"); }
}
@Aspect
@Component
@Order(2)
public class TransactionAspect {
@Around("execution(* com.example.service..*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
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)
public class MetricsAspect {
@AfterReturning("execution(* com.example.service..*.*(..))")
public void afterReturning(JoinPoint jp) { System.out.println("性能監(jiān)控"); }
}執(zhí)行順序示意
flowchart TD
A[方法調用] --> B[LoggingAspect @Before]
B --> C[TransactionAspect @Around 前]
C --> D[目標方法執(zhí)行]
D -->|正常| E[TransactionAspect 提交事務]
D -->|異常| F[TransactionAspect 回滾事務]
E --> G[MetricsAspect @AfterReturning]
F --> H[異常處理切面執(zhí)行]
G --> I[返回客戶端]
H --> I7. 小結
- Spring 事務基于 AOP 環(huán)繞通知實現(xiàn)
- 異常通知和事務回滾緊密關聯(lián)
- 多切面情況下,通知順序由
@Order或Ordered控制 - Mermaid 圖直觀展示了 多切面 + 事務 + 異常 的方法調用鏈
- 理解這個順序有助于正確設計日志、事務、異常切面,避免回滾異常被切面吞掉或日志記錄錯位
到此這篇關于Spring Boot AOP與事務、異常處理交互的問題小結的文章就介紹到這了,更多相關Spring Boot AOP事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot實現(xiàn)STOMP協(xié)議的WebSocket的方法步驟
這篇文章主要介紹了Spring Boot實現(xiàn)STOMP協(xié)議的WebSocket的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
synchronized底層原理之JVM層面的鎖實現(xiàn)細節(jié)與流程
本文從JVM底層視角,詳細拆解了synchronized的實現(xiàn)邏輯,涵蓋鎖的存儲載體(對象頭的MarkWord)、鎖的觸發(fā)指令(monitorenter/monitorexit指令和ACC_SYNCHRONIZED標志位)以及鎖的調度機制,感興趣的朋友跟隨小編一起看看吧2026-01-01
springboot3.2整合mybatis-plus詳細代碼示例
這篇文章主要給大家介紹了關于springboot3.2整合mybatis-plus的相關資料,Spring Boot是一個非常流行的Java Web框架,可以快速地搭建Web應用程序,需要的朋友可以參考下2023-12-12
使用PageHelper插件實現(xiàn)Service層分頁
這篇文章主要為大家詳細介紹了使用PageHelper插件實現(xiàn)Service層分頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

