中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring聲明式事務注解的源碼分析

發布時間:2022-07-16 13:52:09 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Spring聲明式事務注解的源碼分析”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring聲明式事務注解的源碼分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1、@EnableTransactionManagement

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {

@EnableTransactionManagement 注解使用@Import 標簽引入了TransactionManagementConfigurationSelector類,這個類又向容器中導入了兩個重要的組件

Spring聲明式事務注解的源碼分析

2、加載事務控制組件

2.1、AutoProxyRegistrar

AutoProxyRegistrar 類的 registerBeanDefinitions ?法中?注冊了?個組件

Spring聲明式事務注解的源碼分析

進入AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法

Spring聲明式事務注解的源碼分析

發現最終,注冊了?個叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而這個類是AbstractAutoProxyCreator 的子類,實現了 SmartInstantiationAwareBeanPostProcessor 接口

public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

繼承體系結構圖如下

Spring聲明式事務注解的源碼分析

它實現了SmartInstantiationAwareBeanPostProcessor,說明這是?個后置處理器,而且跟spring AOP 開啟@EnableAspectJAutoProxy 時注冊的 AnnotationAwareAspectJProxyCreator實

現的是同?個接口,所以說,聲明式事務是 springAOP 思想的?種應用

2.2、ProxyTransactionManagementConfiguration 組件

@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
// 事務增強器
        BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
// 向事務增強器中注? 屬性解析器 transactionAttributeSource
        advisor.setTransactionAttributeSource(transactionAttributeSource());
// 向事務增強器中注? 事務攔截器 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)
// 事務攔截器 transactionInterceptor
    public TransactionInterceptor transactionInterceptor() {
        TransactionInterceptor interceptor = new TransactionInterceptor();
        interceptor.setTransactionAttributeSource(transactionAttributeSource());
        if (this.txManager != null) {
            interceptor.setTransactionManager(this.txManager);
        }
        return interceptor;
    }
}

ProxyTransactionManagementConfiguration是?個容器配置類,注冊了?個組件transactionAdvisor,稱為事務增強器,然后在這個事務增強器中又注入了兩個屬性:transactionAttributeSource,即屬性解析器transactionAttributeSource 和 事務攔截器transactionInterceptor

屬性解析器 AnnotationTransactionAttributeSource 部分源碼如下

Spring聲明式事務注解的源碼分析

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

Spring聲明式事務注解的源碼分析

屬性解析器的作?之?就是?來解析@Transaction注解

TransactionInterceptor 事務攔截器,部分源碼如下

Spring聲明式事務注解的源碼分析

Spring聲明式事務注解的源碼分析

2.3、上述組件如何關聯起來的

  • 事務攔截器實現了MethodInterceptor接口,追溯?下上面提到的InfrastructureAdvisorAutoProxyCreator后置處理器,它會在代理對象執行目標方法的時候獲取其攔截器鏈,而攔截器鏈就是這個TransactionInterceptor,這就把這兩個組件聯系起來;

  • 構造方法傳?PlatformTransactionManager(事務管理器)、TransactionAttributeSource(屬性解析器),但是追溯一下上?貼的ProxyTransactionManagementConfiguration的源碼,在注冊事務攔截器的時候并沒有調用這個帶參構造方法,而是調用的無參構造方法,然后再調用set方法注?這兩個屬性,效果?樣。

2.4、invokeWithinTransaction?法

部分源碼如下(關注1、2、3、4 標注處)

Spring聲明式事務注解的源碼分析

Spring聲明式事務注解的源碼分析

讀到這里,這篇“Spring聲明式事務注解的源碼分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

固原市| 绵阳市| 望城县| 石家庄市| 儋州市| 城市| 新疆| 乐山市| 桐柏县| 海城市| 安平县| 永善县| 上饶市| 定襄县| 六盘水市| 察雅县| 永康市| 东辽县| 岳池县| 万安县| 民丰县| 乌审旗| 武义县| 高青县| 宣汉县| 新营市| 抚宁县| 金乡县| 金门县| 奉节县| 津市市| 偃师市| 长葛市| 睢宁县| 安徽省| 洪洞县| 都兰县| 临颍县| 板桥市| 建平县| 班玛县|