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

Spring Boot 自動配置中的Spring transaction詳解

 更新時間:2025年09月30日 16:37:14   作者:FrankYoou  
Spring Boot通過TransactionAutoConfiguration 自動裝配事務(wù)管理器和 TransactionTemplate,讓開發(fā)者在引入數(shù)據(jù)源依賴后即可開箱即用事務(wù)功能,無需手動配置,本文給大家介紹Spring Boot 自動配置中的Spring transaction,感興趣的朋友跟隨小編一起看看吧

什么是 Spring 事務(wù)

Spring 事務(wù)是 Spring 框架提供的一種統(tǒng)一事務(wù)管理機制,用來保證數(shù)據(jù)操作的一致性和完整性。它通過聲明式(基于注解或 XML 配置)或編程式(手動調(diào)用 API)兩種方式,簡化了事務(wù)的開啟、提交和回滾邏輯。底層上,Spring 事務(wù)抽象屏蔽了不同持久化技術(shù)(如 JDBC、Hibernate、JPA)的差異,讓開發(fā)者能以一致的方式處理事務(wù),從而避免數(shù)據(jù)不一致或部分提交的問題。

換句話說,Spring 事務(wù)的核心價值在于:簡化事務(wù)管理、統(tǒng)一編程模型、確保數(shù)據(jù)安全可靠

Spring Boot 自動配置類 TransactionAutoConfiguration

包:org.springframework.boot.autoconfigure.transaction

類:TransactionAutoConfiguration

自動配置的部分核心源代碼如下:

@AutoConfiguration
@ConditionalOnClass(PlatformTransactionManager.class)
public class TransactionAutoConfiguration {
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
	public static class TransactionTemplateConfiguration {
		@Bean
		@ConditionalOnMissingBean(TransactionOperations.class)
		public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
			return new TransactionTemplate(transactionManager);
		}
	}
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnBean(TransactionManager.class)
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
	public static class EnableTransactionManagementConfiguration {
		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = false)
		@ConditionalOnBooleanProperty(name = "spring.aop.proxy-target-class", havingValue = false)
		public static class JdkDynamicAutoProxyConfiguration {
		}
		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = true)
		@ConditionalOnBooleanProperty(name = "spring.aop.proxy-target-class", matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {
		}
	}
}

下面我們拆開來分析

@ConditionalOnClass(PlatformTransactionManager.class)

Spring Boot 自動配置的先決條件是類路徑 classpath 下存在 PlatformTransactionManager 這個類;Spring Boot 下引用 “spring-boot-starter-jdbc” 這個依賴時會間接引用這個類的。

    @Configuration(proxyBeanMethods = false)
	@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
	public static class TransactionTemplateConfiguration {
		@Bean
		@ConditionalOnMissingBean(TransactionOperations.class)
		public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
			return new TransactionTemplate(transactionManager);
		}
	}

使用 Spring 事務(wù),必須要給到 PlatformTransactionManager ,這里要求 Spring 容器中必須存在唯一候選的實現(xiàn) PlatformTransactionManager 接口的類的 Bean,自定義 Bean 的代碼可以參考如下:

@Configuration
public class DataSourceConfig {
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        return new DriverManagerDataSource("jdbc:mysql://localhost:3306/your_database", "username", "password");
    }
    @Bean
    @ConditionalOnMissingBean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

如果 Spring 容器中不存在 TransactionOperations 接口實現(xiàn)類的 Bean 的話,會自動創(chuàng)建一個 單例的 Bean(TransactionTemplate 類實現(xiàn)了 TransactionOperations 接口),此 Bean 的名稱為 “transactionTemplate”。

那 TransactionTemplate 都使用在哪些場景呢?

  • TransactionTemplate 是 Spring 提供的編程式事務(wù)管理工具,用于在代碼中顯式控制事務(wù)的開啟、提交和回滾。
  • 它通過回調(diào)機制(execute 方法)將事務(wù)邏輯與業(yè)務(wù)邏輯分離,避免手動編寫繁瑣的 try-catch-finally 事務(wù)控制代碼。
  • 使用時可以靈活設(shè)置事務(wù)傳播行為、隔離級別和超時時間,滿足不同業(yè)務(wù)場景的需求。
  • 適合在 無法使用聲明式事務(wù)(@Transactional) 的場景下,或需要對事務(wù)邊界進(jìn)行更細(xì)粒度控制時使用。
  • 常見應(yīng)用場景包括:批量操作中部分步驟需要獨立事務(wù)、跨方法調(diào)用時避免事務(wù)傳播問題、或在框架/工具類中封裝事務(wù)邏輯。
@Configuration(proxyBeanMethods = false)
	@ConditionalOnBean(TransactionManager.class)
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
	public static class EnableTransactionManagementConfiguration {
		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = false)
		@ConditionalOnBooleanProperty(name = "spring.aop.proxy-target-class", havingValue = false)
		public static class JdkDynamicAutoProxyConfiguration {
		}
		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = true)
		@ConditionalOnBooleanProperty(name = "spring.aop.proxy-target-class", matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {
		}
	}

上面這個配置類的作用,是為 Spring 的聲明式事務(wù)管理(即使用 @Transactional 注解) 啟用合適的 AOP 代理機制:

  • @EnableTransactionManagement 本身就是開啟基于 AOP 的事務(wù)管理的關(guān)鍵注解。
    • proxyTargetClass 參數(shù)決定了 Spring 在為 @Transactional 方法生成代理時,使用 JDK 動態(tài)代理(接口代理)還是 CGLIB 子類代理。
    • proxyTargetClass = false → 使用 JDK 動態(tài)代理(要求目標(biāo)類有接口)。
    • proxyTargetClass = true → 使用 CGLIB 代理(通過生成子類實現(xiàn)代理,適合沒有接口的類)。
  • 這段配置通過 @ConditionalOnBooleanProperty(name = "spring.aop.proxy-target-class", …) 來根據(jù)配置文件中的 spring.aop.proxy-target-class 屬性,自動選擇 JDK 或 CGLIB 代理。
  • 因此,它確實是針對 @Transactional 注解生效時所依賴的代理機制 的配置。

使用TransactionTemplate 顯式控制事務(wù)

    @Autowired
    private TransactionOperations transactionTemplate;
    @Override
    public List<String> listDepartmentsByCorpId(String corpId) {
        return transactionTemplate.execute(status -> List.of("dingtalk_dept1", "dingtalk_dept2"));
    }

使用Spring 的聲明式事務(wù)管理(即使用@Transactional注解)

    @Transactional(rollbackFor = Exception.class)
    public List<String> listDepartmentsByCorpId(String corpId) {
        return List.of("dingtalk_dept1", "dingtalk_dept2");
    }

總結(jié)

Spring Boot 通過 TransactionAutoConfiguration 自動裝配事務(wù)管理器和 TransactionTemplate,讓開發(fā)者在引入數(shù)據(jù)源依賴后即可開箱即用事務(wù)功能,無需手動配置。它同時啟用基于 @Transactional 的聲明式事務(wù)管理,并根據(jù) spring.aop.proxy-target-class 自動選擇 JDK 動態(tài)代理或 CGLIB 代理

到此這篇關(guān)于Spring Boot 自動配置之 Spring transaction的文章就介紹到這了,更多相關(guān)Spring Boot 自動配置Spring transaction內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控的實現(xiàn)

    Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控的實現(xiàn)

    這篇文章主要介紹了Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • Spring?Boot快速過濾出一次請求的所有日志

    Spring?Boot快速過濾出一次請求的所有日志

    這篇文章主要介紹了Spring?Boot快速過濾出一次請求的所有日志,本文講述了如何使用MDC工具來快速過濾一次請求的所有日志,并通過裝飾器模式使得MDC工具在異步線程里也能生效,需要的朋友可以參考下
    2022-11-11
  • javaweb中Filter(過濾器)的常見應(yīng)用

    javaweb中Filter(過濾器)的常見應(yīng)用

    這篇文章主要介紹了javaweb中Filter的常見應(yīng)用,過濾器的使用方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法

    idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法

    這篇文章主要介紹了idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Spring AOP AspectJ使用及配置過程解析

    Spring AOP AspectJ使用及配置過程解析

    這篇文章主要介紹了Spring AOP AspectJ使用及配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 劍指Offer之Java算法習(xí)題精講鏈表專題篇

    劍指Offer之Java算法習(xí)題精講鏈表專題篇

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java線程池隊列LinkedTransferQueue示例詳解

    Java線程池隊列LinkedTransferQueue示例詳解

    這篇文章主要為大家介紹了Java線程池隊列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • springboot無法跳轉(zhuǎn)頁面的問題解決方案

    springboot無法跳轉(zhuǎn)頁面的問題解決方案

    這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09

最新評論

屯门区| 嘉峪关市| 大洼县| 岚皋县| 静安区| 新疆| 阿城市| 砀山县| 德昌县| 高淳县| 富民县| 横峰县| 长乐市| 舟曲县| 瑞安市| 南溪县| 休宁县| 遂溪县| 巩留县| 开平市| 宁安市| 白银市| 遵化市| 宕昌县| 深圳市| 吉安县| 大连市| 长顺县| 保康县| 阜南县| 元江| 泰州市| 刚察县| 唐河县| 大石桥市| 道孚县| 五家渠市| 图片| 盈江县| 曲松县| 布尔津县|