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

Spring Boot 自動(dòng)配置中的Spring transaction詳解

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

什么是 Spring 事務(wù)

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

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

Spring Boot 自動(dòng)配置類 TransactionAutoConfiguration

包:org.springframework.boot.autoconfigure.transaction

類:TransactionAutoConfiguration

自動(dòng)配置的部分核心源代碼如下:

@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 自動(dòng)配置的先決條件是類路徑 classpath 下存在 PlatformTransactionManager 這個(gè)類;Spring Boot 下引用 “spring-boot-starter-jdbc” 這個(gè)依賴時(shí)會(huì)間接引用這個(gè)類的。

    @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 容器中必須存在唯一候選的實(shí)現(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 接口實(shí)現(xiàn)類的 Bean 的話,會(huì)自動(dòng)創(chuàng)建一個(gè) 單例的 Bean(TransactionTemplate 類實(shí)現(xiàn)了 TransactionOperations 接口),此 Bean 的名稱為 “transactionTemplate”

那 TransactionTemplate 都使用在哪些場(chǎng)景呢?

  • TransactionTemplate 是 Spring 提供的編程式事務(wù)管理工具,用于在代碼中顯式控制事務(wù)的開啟、提交和回滾。
  • 它通過回調(diào)機(jī)制(execute 方法)將事務(wù)邏輯與業(yè)務(wù)邏輯分離,避免手動(dòng)編寫繁瑣的 try-catch-finally 事務(wù)控制代碼。
  • 使用時(shí)可以靈活設(shè)置事務(wù)傳播行為、隔離級(jí)別和超時(shí)時(shí)間,滿足不同業(yè)務(wù)場(chǎng)景的需求。
  • 適合在 無法使用聲明式事務(wù)(@Transactional) 的場(chǎng)景下,或需要對(duì)事務(wù)邊界進(jìn)行更細(xì)粒度控制時(shí)使用。
  • 常見應(yīng)用場(chǎng)景包括:批量操作中部分步驟需要獨(dú)立事務(wù)、跨方法調(diào)用時(shí)避免事務(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 {
		}
	}

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

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

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

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

相關(guān)文章

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

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

    這篇文章主要介紹了Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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ì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • Spring?Boot快速過濾出一次請(qǐng)求的所有日志

    Spring?Boot快速過濾出一次請(qǐng)求的所有日志

    這篇文章主要介紹了Spring?Boot快速過濾出一次請(qǐng)求的所有日志,本文講述了如何使用MDC工具來快速過濾一次請(qǐng)求的所有日志,并通過裝飾器模式使得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ì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring AOP AspectJ使用及配置過程解析

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

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

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

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(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ū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java線程池隊(duì)列LinkedTransferQueue示例詳解

    Java線程池隊(duì)列LinkedTransferQueue示例詳解

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

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

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

最新評(píng)論

南雄市| 越西县| 德江县| 蒙山县| 元阳县| 洪洞县| 霸州市| 涞源县| 建平县| 稷山县| 左权县| 大厂| 丽水市| 河池市| 乐安县| 枞阳县| 塔河县| 英超| 察雅县| 淮滨县| 东辽县| 临猗县| 明光市| 天镇县| 永靖县| 沈丘县| 壶关县| 白水县| 公安县| 大兴区| 化州市| 武安市| 秭归县| 关岭| 遂平县| 东乌珠穆沁旗| 会昌县| 图片| 望城县| 玉溪市| 石景山区|