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)文章希望大家以后多多支持腳本之家!
- SpringBoot 中的 @Transactional 事務(wù)基本作用及注意事項示例詳解
- SpringBoot事務(wù)注解@Transactional失效場景與解決方案
- Springboot @Transactional大事務(wù)處理的幾點建議
- Springboot中@Transactional注解與異常處理機制方式
- SpringBoot中TransactionTemplate事務(wù)管理的實現(xiàn)
- Java中SpringBoot的@Transactional原理
- springboot編程式事務(wù)TransactionTemplate的使用說明
- 解決SpringBoot中使用@Transactional注解遇到的問題
- springboot中使用@Transactional注解事物不生效的坑
- springboot中事務(wù)管理@Transactional的注意事項與使用場景
相關(guā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)之圖的路徑查找算法詳解
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-11-11
javaweb中Filter(過濾器)的常見應(yīng)用
這篇文章主要介紹了javaweb中Filter的常見應(yīng)用,過濾器的使用方法,感興趣的小伙伴們可以參考一下2015-12-12
idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法
這篇文章主要介紹了idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別
下面小編就為大家?guī)硪黄獪\談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
Java線程池隊列LinkedTransferQueue示例詳解
這篇文章主要為大家介紹了Java線程池隊列LinkedTransferQueue示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09

