Spring深入刨析聲明式事務(wù)注解的源碼
聲明式事務(wù)很方便,尤其純注解模式,僅僅幾個注解就能控制事務(wù)了
思考:這些注解都做了什么?好神奇!
@EnableTransactionManagement @Transactional
1、@EnableTransactionManagement
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {@EnableTransactionManagement 注解使用@Import 標(biāo)簽引入了TransactionManagementConfigurationSelector類,這個類又向容器中導(dǎo)入了兩個重要的組件

2、加載事務(wù)控制組件
2.1、AutoProxyRegistrar
AutoProxyRegistrar 類的 registerBeanDefinitions ?法中?注冊了?個組件

進入AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法

發(fā)現(xiàn)最終,注冊了?個叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而這個類是AbstractAutoProxyCreator 的子類,實現(xiàn)了 SmartInstantiationAwareBeanPostProcessor 接口
public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
繼承體系結(jié)構(gòu)圖如下

它實現(xiàn)了SmartInstantiationAwareBeanPostProcessor,說明這是?個后置處理器,而且跟spring AOP 開啟@EnableAspectJAutoProxy 時注冊的 AnnotationAwareAspectJProxyCreator實
現(xiàn)的是同?個接口,所以說,聲明式事務(wù)是 springAOP 思想的?種應(yīng)用
2.2、ProxyTransactionManagementConfiguration 組件
@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
// 事務(wù)增強器
BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
// 向事務(wù)增強器中注? 屬性解析器 transactionAttributeSource
advisor.setTransactionAttributeSource(transactionAttributeSource());
// 向事務(wù)增強器中注? 事務(wù)攔截器 transactionInterceptor
advisor.setAdvice(transactionInterceptor());
if (this.enableTx != null) {
advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
}
return advisor;
}
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
// 屬性解析器 transactionAttributeSource
public TransactionAttributeSource transactionAttributeSource() {
return new AnnotationTransactionAttributeSource();
}
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
// 事務(wù)攔截器 transactionInterceptor
public TransactionInterceptor transactionInterceptor() {
TransactionInterceptor interceptor = new TransactionInterceptor();
interceptor.setTransactionAttributeSource(transactionAttributeSource());
if (this.txManager != null) {
interceptor.setTransactionManager(this.txManager);
}
return interceptor;
}
}ProxyTransactionManagementConfiguration是?個容器配置類,注冊了?個組件transactionAdvisor,稱為事務(wù)增強器,然后在這個事務(wù)增強器中又注入了兩個屬性:transactionAttributeSource,即屬性解析器transactionAttributeSource 和 事務(wù)攔截器transactionInterceptor
屬性解析器 AnnotationTransactionAttributeSource 部分源碼如下

屬性解析器有?個成員變量是annotationParsers,是?個集合,可以添加多種注解解析器(TransactionAnnotationParser),我們關(guān)注 Spring 的注解解析器,部分源碼如下

屬性解析器的作?之?就是?來解析@Transaction注解
TransactionInterceptor 事務(wù)攔截器,部分源碼如下


2.3、上述組件如何關(guān)聯(lián)起來的
- 事務(wù)攔截器實現(xiàn)了MethodInterceptor接口,追溯?下上面提到的InfrastructureAdvisorAutoProxyCreator后置處理器,它會在代理對象執(zhí)行目標(biāo)方法的時候獲取其攔截器鏈,而攔截器鏈就是這個TransactionInterceptor,這就把這兩個組件聯(lián)系起來;
- 構(gòu)造方法傳?PlatformTransactionManager(事務(wù)管理器)、TransactionAttributeSource(屬性解析器),但是追溯一下上?貼的ProxyTransactionManagementConfiguration的源碼,在注冊事務(wù)攔截器的時候并沒有調(diào)用這個帶參構(gòu)造方法,而是調(diào)用的無參構(gòu)造方法,然后再調(diào)用set方法注?這兩個屬性,效果?樣。
2.4、invokeWithinTransaction?法
部分源碼如下(關(guān)注1、2、3、4 標(biāo)注處)


到此這篇關(guān)于Spring深入刨析聲明式事務(wù)注解的源碼的文章就介紹到這了,更多相關(guān)Spring聲明式事務(wù)注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring-Bean創(chuàng)建對象的步驟方式詳解
在本篇文章里小編給大家分享的是關(guān)于Spring-Bean創(chuàng)建對象的步驟方式詳解內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。2020-02-02
Java 中解決Unsupported major.minor version 51.0的問題
本文主要介紹解決Unsupported major.minor version 51.0的問題, 這里給大家整理了詳細(xì)資料,有需要的小伙伴可以參考下2016-08-08
Java中l(wèi)ogback?自動刷新不生效的問題解決
本文主要介紹了Java中l(wèi)ogback?自動刷新不生效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
SpringBoot+Spring Security無法實現(xiàn)跨域的解決方案
這篇文章主要介紹了SpringBoot+Spring Security無法實現(xiàn)跨域的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式
這篇文章主要介紹了postman中POST請求時參數(shù)包含參數(shù)list設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

