您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Spring聲明式事務注解的源碼分析”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring聲明式事務注解的源碼分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(TransactionManagementConfigurationSelector.class) public @interface EnableTransactionManagement {
@EnableTransactionManagement 注解使用@Import 標簽引入了TransactionManagementConfigurationSelector類,這個類又向容器中導入了兩個重要的組件
AutoProxyRegistrar 類的 registerBeanDefinitions ?法中?注冊了?個組件
進入AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法
發現最終,注冊了?個叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而這個類是AbstractAutoProxyCreator 的子類,實現了 SmartInstantiationAwareBeanPostProcessor 接口
public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
繼承體系結構圖如下
它實現了SmartInstantiationAwareBeanPostProcessor,說明這是?個后置處理器,而且跟spring AOP 開啟@EnableAspectJAutoProxy 時注冊的 AnnotationAwareAspectJProxyCreator實
現的是同?個接口,所以說,聲明式事務是 springAOP 思想的?種應用
@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 部分源碼如下
屬性解析器有?個成員變量是annotationParsers,是?個集合,可以添加多種注解解析器(TransactionAnnotationParser),我們關注 Spring 的注解解析器,部分源碼如下
屬性解析器的作?之?就是?來解析@Transaction注解
TransactionInterceptor 事務攔截器,部分源碼如下
事務攔截器實現了MethodInterceptor接口,追溯?下上面提到的InfrastructureAdvisorAutoProxyCreator后置處理器,它會在代理對象執行目標方法的時候獲取其攔截器鏈,而攔截器鏈就是這個TransactionInterceptor,這就把這兩個組件聯系起來;
構造方法傳?PlatformTransactionManager(事務管理器)、TransactionAttributeSource(屬性解析器),但是追溯一下上?貼的ProxyTransactionManagementConfiguration的源碼,在注冊事務攔截器的時候并沒有調用這個帶參構造方法,而是調用的無參構造方法,然后再調用set方法注?這兩個屬性,效果?樣。
部分源碼如下(關注1、2、3、4 標注處)
讀到這里,這篇“Spring聲明式事務注解的源碼分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。