91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

石景山区| 博客| 贵港市| 勃利县| 博兴县| 汤阴县| 洞口县| 渑池县| 上蔡县| 宁津县| 休宁县| 文安县| 巴中市| 界首市| 扶风县| 嫩江县| 临夏市| 青岛市| 昌黎县| 临沂市| 青铜峡市| 永泰县| 潼关县| 福建省| 兴宁市| 固安县| 龙海市| 从江县| 米易县| 万盛区| 新营市| 云林县| 兴海县| 子长县| 天峻县| 天水市| 怀远县| 丰城市| 乾安县| 偏关县| 剑川县|