最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?AOP與事務、異常處理交互的問題小結

 更新時間:2025年12月24日 09:00:05   作者:Qiuner  
文章介紹了Spring?Boot中AOP與事務、異常處理的交互,包括@Transactional注解的處理機制、事務與AOP的結合、切面執(zhí)行順序以及異常通知與事務的交互,通過示例和流程圖,詳細說明了在多切面環(huán)境下,通知的執(zhí)行順序及其實現(xiàn)原理,感興趣的朋友跟隨小編一起看看吧

Spring Boot AOP (四)與事務、異常處理交互

1. 引言

在企業(yè)項目中,AOP 不僅用于日志和性能監(jiān)控,還與 事務管理、異常處理 密切相關。理解 AOP、事務、異常三者的執(zhí)行順序 對架構設計和問題排查至關重要。

Spring 事務是通過 AOP 代理實現(xiàn)的,@Transactional 注解會生成一個事務切面,織入目標方法。

2. @Transactional 與 AOP 結合

2.1 核心機制

  1. @Transactional 注解會被 TransactionInterceptor 處理
  2. Spring 使用 環(huán)繞通知(Around Advice)在方法調用前開啟事務,方法執(zhí)行后提交或回滾事務
  3. 如果目標方法拋出異常,事務回滾策略生效

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 --> I

4. 異常通知與事務交互

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 --> I

7. 小結

  • Spring 事務基于 AOP 環(huán)繞通知實現(xiàn)
  • 異常通知和事務回滾緊密關聯(lián)
  • 多切面情況下,通知順序由 @OrderOrdered 控制
  • Mermaid 圖直觀展示了 多切面 + 事務 + 異常 的方法調用鏈
  • 理解這個順序有助于正確設計日志、事務、異常切面,避免回滾異常被切面吞掉或日志記錄錯位

到此這篇關于Spring Boot AOP與事務、異常處理交互的問題小結的文章就介紹到這了,更多相關Spring Boot AOP事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot實現(xiàn)STOMP協(xié)議的WebSocket的方法步驟

    Spring Boot實現(xiàn)STOMP協(xié)議的WebSocket的方法步驟

    這篇文章主要介紹了Spring Boot實現(xiàn)STOMP協(xié)議的WebSocket的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • java實現(xiàn)登錄驗證碼

    java實現(xiàn)登錄驗證碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)登錄驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解java中if語句和switch的使用

    詳解java中if語句和switch的使用

    這篇文章主要介紹了java中if語句和switch的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • synchronized底層原理之JVM層面的鎖實現(xiàn)細節(jié)與流程

    synchronized底層原理之JVM層面的鎖實現(xiàn)細節(jié)與流程

    本文從JVM底層視角,詳細拆解了synchronized的實現(xiàn)邏輯,涵蓋鎖的存儲載體(對象頭的MarkWord)、鎖的觸發(fā)指令(monitorenter/monitorexit指令和ACC_SYNCHRONIZED標志位)以及鎖的調度機制,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java 各個JSONObject的區(qū)別小結

    java 各個JSONObject的區(qū)別小結

    在Java中,??JSONObject???是用于表示JSON對象的類,但不同庫提供的JSONObject???實現(xiàn)之間存在一些差異,本文幾個常見的JSON庫及其JSONObje,感興趣的可以了解一下
    2025-10-10
  • Java實現(xiàn)分庫分表實踐指南

    Java實現(xiàn)分庫分表實踐指南

    在開發(fā)中我們經(jīng)常使用到分庫分表,但是一般是我們前期就已經(jīng)做了規(guī)劃,對數(shù)據(jù)庫怎么劃分,對哪些表進行分表,這篇文章主要給大家介紹了關于Java實現(xiàn)分庫分表的相關資料,需要的朋友可以參考下
    2024-01-01
  • 如何通過Java生成一個隨機數(shù)

    如何通過Java生成一個隨機數(shù)

    當我們需要在Java中生成隨機數(shù)時,可以借助JDK中提供的Random類來實現(xiàn),通過使用Random類,我們可以輕松地生成各種類型的隨機數(shù),下面我們就來看看如何利用Random類生成隨機數(shù)吧
    2023-09-09
  • Java 內置接口 Serializable示例詳解

    Java 內置接口 Serializable示例詳解

    這篇文章主要為大家介紹了Java 內置接口 Serializable示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • springboot3.2整合mybatis-plus詳細代碼示例

    springboot3.2整合mybatis-plus詳細代碼示例

    這篇文章主要給大家介紹了關于springboot3.2整合mybatis-plus的相關資料,Spring Boot是一個非常流行的Java Web框架,可以快速地搭建Web應用程序,需要的朋友可以參考下
    2023-12-12
  • 使用PageHelper插件實現(xiàn)Service層分頁

    使用PageHelper插件實現(xiàn)Service層分頁

    這篇文章主要為大家詳細介紹了使用PageHelper插件實現(xiàn)Service層分頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

菏泽市| 利辛县| 屏南县| 鄯善县| 德庆县| 图木舒克市| 贵阳市| 上思县| 三台县| 喀喇| 石河子市| 伽师县| 特克斯县| 沧州市| 前郭尔| 麻江县| 哈密市| 浏阳市| 德庆县| 石狮市| 莫力| 仪陇县| 宜兴市| 突泉县| 安顺市| 嘉鱼县| 江永县| 义马市| 牡丹江市| 赤城县| 常德市| 沙雅县| 芜湖市| 荃湾区| 淮安市| 英山县| 康马县| 昌平区| 郯城县| 霍山县| 璧山县|