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

Spring事務(wù)管理@Transactional注解最佳實踐

 更新時間:2026年02月24日 09:28:31   作者:寒人病酒  
本文詳細介紹了Spring框架的核心特性,包括IOC容器、AOP面向切面編程和事務(wù)管理,重點解析了Spring事務(wù)的傳播行為和隔離級別,以及SpringBoot的自動配置原理,本文給大家講解的非常詳細,感興趣的朋友跟隨小編一起看看吧

Spring事務(wù)管理:@Transactional注解深度解析

Spring框架是Java后端開發(fā)的核心技術(shù)棧,掌握其原理和最佳實踐至關(guān)重要。

一、Spring核心特性

事務(wù)管理是企業(yè)級應(yīng)用的核心功能,理解Spring事務(wù)的傳播行為和隔離級別對保證數(shù)據(jù)一致性至關(guān)重要

二、IOC容器

2.1 Bean的生命周期

Spring Bean 生命周期流程:

實例化
  ↓
屬性賦值 (populateBean)
  ↓
BeanNameAware (setBeanName)
  ↓
BeanFactoryAware (setBeanFactory)
  ↓
ApplicationContextAware (setApplicationContext)
  ↓
BeanPostProcessor前置 (postProcessBeforeInitialization)
  ↓
InitializingBean (afterPropertiesSet)
  ↓
init-method (自定義初始化方法)
  ↓
BeanPostProcessor后置 (postProcessAfterInitialization)
  ↓
使用Bean (ready for use)
  ↓
DisposableBean (destroy)
  ↓
destroy-method (自定義銷毀方法)

說明:
- 藍色節(jié)點:Spring 提供的擴展接口
- 綠色節(jié)點:用戶自定義的方法

2.2 依賴注入方式

// 1. 構(gòu)造器注入(推薦)
@Component
public class UserService {
    private final UserRepository userRepository;
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 2. Setter注入
@Component
public class UserService {
    private UserRepository userRepository;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 3. 字段注入(不推薦)
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

三、AOP面向切面編程

3.1 AOP核心概念

  • 切面(Aspect):橫切關(guān)注點的模塊化
  • 連接點(JoinPoint):程序執(zhí)行的某個位置
  • 切點(Pointcut):匹配連接點的表達式
  • 通知(Advice):在切點上執(zhí)行的動作
  • 目標對象(Target):被代理的對象

3.2 通知類型

@Aspect
@Component
public class LoggingAspect {
    // 前置通知
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("Before: " + joinPoint.getSignature());
    }
    // 后置通知
    @After("execution(* com.example.service.*.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        System.out.println("After: " + joinPoint.getSignature());
    }
    // 返回通知
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))",
                     returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("AfterReturning: " + result);
    }
    // 異常通知
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))",
                   throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Exception ex) {
        System.out.println("AfterThrowing: " + ex.getMessage());
    }
    // 環(huán)繞通知
    @Around("execution(* com.example.service.*.*(..))")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around Before");
        Object result = joinPoint.proceed();
        System.out.println("Around After");
        return result;
    }
}

四、Spring事務(wù)管理

4.1 事務(wù)注解

@Service
public class OrderService {
    // 聲明式事務(wù)
    @Transactional(
        propagation = Propagation.REQUIRED,  // 傳播行為
        isolation = Isolation.READ_COMMITTED,  // 隔離級別
        timeout = 30,  // 超時時間
        readOnly = false,  // 只讀
        rollbackFor = Exception.class  // 回滾異常
    )
    public void createOrder(Order order) {
        // 業(yè)務(wù)邏輯
    }
}

4.2 事務(wù)傳播行為

傳播行為說明
REQUIRED默認,如果存在事務(wù)則加入,否則新建
REQUIRES_NEW新建事務(wù),掛起當前事務(wù)
SUPPORTS如果存在事務(wù)則加入,否則非事務(wù)執(zhí)行
NOT_SUPPORTED非事務(wù)執(zhí)行,掛起當前事務(wù)
MANDATORY必須在事務(wù)中,否則拋異常
NEVER必須非事務(wù)執(zhí)行,否則拋異常
NESTED嵌套事務(wù),回滾點保存

五、Spring Boot自動配置

5.1 自動配置原理

// @EnableAutoConfiguration 注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String[] excludeName() default {};
}
// 自動配置類示例
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    // 配置邏輯
}

5.2 常用注解

// 條件注解
@ConditionalOnClass        // 類路徑下存在指定類
@ConditionalOnMissingClass  // 類路徑下不存在指定類
@ConditionalOnBean         // 容器中存在指定Bean
@ConditionalOnMissingBean   // 容器中不存在指定Bean
@ConditionalOnProperty      // 配置屬性滿足條件
@ConditionalOnWebApplication  // Web環(huán)境

六、常見面試題

Q1: Spring中循環(huán)依賴如何解決?

答案:
Spring通過三級緩存解決循環(huán)依賴:

// 三級緩存
1. singletonObjects          // 一級緩存:完整的Bean
2. earlySingletonObjects     // 二級緩存:提前暴露的Bean
3. singletonFactories        // 三級緩存:Bean的工廠
// 解決流程
1. A實例化后,放入三級緩存
2. A注入B,B需要A
3. B從三級緩存獲取A的工廠,創(chuàng)建A的代理對象
4. B注入A的代理對象,B完成初始化
5. A繼續(xù)初始化,注入B,完成初始化

Q2: @Autowired和@Resource的區(qū)別?

答案:

特性@Autowired@Resource
來源SpringJava JSR-250
匹配方式按類型,其次按名稱按名稱,其次按類型
Required屬性支持不支持
作用位置構(gòu)造器、方法、字段方法、字段

Q3: 事務(wù)失效的場景有哪些?

答案:
1. 方法不是public
2. 方法自調(diào)用(this調(diào)用)
3. 異常被捕獲未拋出
4. 異常類型不匹配(默認RuntimeException)
5. 數(shù)據(jù)庫引擎不支持事務(wù)
6. 未被Spring管理(無@Component等注解)

七、最佳實踐

代碼規(guī)范:
- 優(yōu)先使用構(gòu)造器注入
- 合理使用AOP,避免過度設(shè)計
- 事務(wù)粒度要小,避免大事務(wù)

性能優(yōu)化:
- 使用循環(huán)依賴緩存
- 合理使用懶加載(@Lazy)
- 控制Bean的生命周期

八、總結(jié)

Spring框架博大精深,持續(xù)學習:

? 核心要點
- 掌握IOC和AOP原理
- 理解事務(wù)傳播機制
- 熟悉自動配置原理

進階方向
- 閱讀Spring源碼
- 學習Spring Cloud微服務(wù)
- 實踐項目應(yīng)用

推薦資源
- 《Spring實戰(zhàn)》
- Spring官方文檔
- Spring源碼分析

到此這篇關(guān)于Spring事務(wù)管理@Transactional注解最佳實踐的文章就介紹到這了,更多相關(guān)Spring事務(wù)管理@Transactional注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java對指定目錄下文件讀寫操作介紹

    java對指定目錄下文件讀寫操作介紹

    本文將詳細介紹java對指定目錄下文件的讀寫功能實現(xiàn),需要的朋友可以參考下
    2012-11-11
  • MyBatis傳入多個參數(shù)時parameterType的寫法

    MyBatis傳入多個參數(shù)時parameterType的寫法

    這篇文章主要介紹了MyBatis傳入多個參數(shù)時parameterType的寫法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • springboot與mybatis整合實例詳解(完美融合)

    springboot與mybatis整合實例詳解(完美融合)

    大家都知道springboot搭建一個spring框架只需要秒秒鐘。下面通過實例代碼給大家介紹一下springboot與mybatis的完美融合,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • Java實現(xiàn)走迷宮回溯算法

    Java實現(xiàn)走迷宮回溯算法

    這篇文章主要為大家詳細介紹了Java實現(xiàn)走迷宮回溯算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot超詳細講解@Value注解

    SpringBoot超詳細講解@Value注解

    在使用spring框架的項目中,@Value是經(jīng)常使用的注解之一。作用是將配置文件中的鍵對應(yīng)的值分配給某類內(nèi)帶注解的屬性。本文使您系統(tǒng)地了解@Value的用法。在使用Spring框架的項目中@Value是經(jīng)常使用的注解之一,其作用是將配置文件中的鍵對應(yīng)的值分配給某類內(nèi)帶注解的屬性
    2022-07-07
  • Java詳細分析梳理垃圾回收機制

    Java詳細分析梳理垃圾回收機制

    垃圾回收,顧名思義,便是將已經(jīng)分配出去的,但卻不再使用的內(nèi)存回收回來,以便能夠再次分配。在?Java?虛擬機的語境下,垃圾指的是死亡的對象所占據(jù)的堆空間
    2022-04-04
  • Java報錯:java.util.concurrent.ExecutionException的解決辦法

    Java報錯:java.util.concurrent.ExecutionException的解決辦法

    在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來管理和協(xié)調(diào)多個線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時,可能會遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細分析這種異常的背景、可能的原因
    2024-09-09
  • 創(chuàng)建Maven項目和Spring IOC實例過程解析

    創(chuàng)建Maven項目和Spring IOC實例過程解析

    這篇文章主要介紹了創(chuàng)建Maven項目和Spring IOC實例過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 一文讓你徹底學會Java左移、右移操作

    一文讓你徹底學會Java左移、右移操作

    這篇文章主要介紹了了Java中的位運算符,包括左移(<<)、右移(>>)和無符號右移(>>>),左移將數(shù)字的二進制位向左移動,相當于乘以2的n次方;右移將數(shù)字的二進制位向右移動,保留符號位,相當于除以2的n次方,文中介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • elasticsearch+logstash并使用java代碼實現(xiàn)日志檢索

    elasticsearch+logstash并使用java代碼實現(xiàn)日志檢索

    這篇文章主要介紹了elasticsearch+logstash并使用java代碼實現(xiàn)日志檢索,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

澎湖县| 奉化市| 江阴市| 南部县| 兴义市| 峡江县| 玉龙| 铜川市| 南乐县| 祁连县| 胶州市| 吉木萨尔县| 明溪县| 岗巴县| 兴义市| 稷山县| 茂名市| 根河市| 建宁县| 疏附县| 吉林省| 淄博市| 浏阳市| 资阳市| 乐亭县| 将乐县| 广德县| 汉寿县| 阳西县| 正安县| 建昌县| 静乐县| 辽宁省| 盐山县| 山西省| 通州区| 黔东| 永靖县| 临潭县| 于田县| 洪雅县|