Spring深入刨析聲明式事務註解的源碼
聲明式事務很方便,尤其純註解模式,僅僅幾個註解就能控制事務瞭
思考:這些註解都做瞭什麼?好神奇!
@EnableTransactionManagement @Transactional
1、@EnableTransactionManagement
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(TransactionManagementConfigurationSelector.class) public @interface EnableTransactionManagement {
@EnableTransactionManagement 註解使用@Import 標簽引入瞭TransactionManagementConfigurationSelector類,這個類又向容器中導入瞭兩個重要的組件
2、加載事務控制組件
2.1、AutoProxyRegistrar
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 思想的⼀種應用
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 部分源碼如下
屬性解析器有⼀個成員變量是annotationParsers,是⼀個集合,可以添加多種註解解析器(TransactionAnnotationParser),我們關註 Spring 的註解解析器,部分源碼如下
屬性解析器的作⽤之⼀就是⽤來解析@Transaction註解
TransactionInterceptor 事務攔截器,部分源碼如下
2.3、上述組件如何關聯起來的
- 事務攔截器實現瞭MethodInterceptor接口,追溯⼀下上面提到的InfrastructureAdvisorAutoProxyCreator後置處理器,它會在代理對象執行目標方法的時候獲取其攔截器鏈,而攔截器鏈就是這個TransactionInterceptor,這就把這兩個組件聯系起來;
- 構造方法傳⼊PlatformTransactionManager(事務管理器)、TransactionAttributeSource(屬性解析器),但是追溯一下上⾯貼的ProxyTransactionManagementConfiguration的源碼,在註冊事務攔截器的時候並沒有調用這個帶參構造方法,而是調用的無參構造方法,然後再調用set方法註⼊這兩個屬性,效果⼀樣。
2.4、invokeWithinTransaction⽅法
部分源碼如下(關註1、2、3、4 標註處)
到此這篇關於Spring深入刨析聲明式事務註解的源碼的文章就介紹到這瞭,更多相關Spring聲明式事務註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring聲明式事務註解之@EnableTransactionManagement解析
- Spring事務的開啟原理詳解
- Spring AOP底層源碼詳解
- Java Spring AOP源碼解析之事務實現原理
- 詳解Spring中Lookup註解的使用