Spring Boot自動配置:Transaction AutoConfigration


概要TransactionAutoConfigurationは、Spring Bootのトランザクションに関する自動構成クラスである.PlatformTransactionManagerはクラスclasspathJtaAutoConfiguration上に存在する場合にのみ有効である.そして以下の自動構成クラスのアプリケーションの後に適用します.
  • HibernateJpaAutoConfiguration
  • DataSourceTransactionManagerAutoConfiguration
  • Neo4jDataAutoConfiguration
  • TransactionAutoConfiguration
  • beanは、以下のように定義されている.
  • TransactionManagerCustomizers platformTransactionManagerCustomizers容器内に存在する全てのPlatformTransactionManagerCustomizer beanコンポーネントの一つの包装について
  • TransactionTemplate transactionTemplatePlatformTransactionManager beanコンポーネントが容器内に存在する場合のみ定義される.
  • また、TransactionAutoConfigurationは、構成属性項目spring.aop.proxy-target-classの使用状況に応じて、注釈@EnableTransactionManagementの使用方法を決定する.
  • spring.aop.proxy-target-classは、falseに明確に設定されている.
    注釈を使う@EnableTransactionManagement(proxyTargetClass = false)
  • spring.aop.proxy-target-classが使用されていない、またはtrueに設定されている.
    注釈を使う@EnableTransactionManagement(proxyTargetClass = true)
  • TransactionAutoConfigurationは注釈@EnableTransactionManagementを使用し、注釈@EnableTransactionManagementはさらにクラスTransactionManagementConfigurationSelectorを導入している.これは@EnableTransactionManagementの注釈属性modeに基づいて、どのクラスの導入を決定するかを決定するImportSelectorである.デフォルトの場合、注釈@EnableTransactionManagementの属性modePROXYであり、この場合TransactionManagementConfigurationSelectorはこれに応じてAutoProxyRegistrarおよびProxyTransactionManagementConfigurationを導入している.AutoProxyRegistrarはさらに、以下の基礎設定beanを容器に登録する.
  • bean org.springframework.aop.config.internalAutoProxyCreator
  • bean類:InfrastructureAdvisorAutoProxyCreator
  • 登録ツールAopConfigUtils#registerAutoProxyCreatorIfNecessaryProxyTransactionManagementConfigurationはさらに、以下の基礎設定beanを容器に登録する.
  • bean org.springframework.transaction.config.internalTransactionAdvisor
  • bean類:BeanFactoryTransactionAttributeSourceAdvisor
  • bean transactionAttributeSourceおよびtransactionInterceptorに依存する.
  • bean transactionInterceptor
  • bean類:TransactionInterceptor
  • bean transactionAttributeSourceに依存しています.
  • bean transactionAttributeSource
  • bean類:AnnotationTransactionAttributeSource
  • bean org.springframework.transaction.config.internalTransactionalEventListenerFactory
  • bean類:TransactionalEventListenerFactory
  • ベースAbstractTransactionManagementConfigurationによって定義される.
    ソースコード
    ソースコードバージョン:spring-book-at configre-2.13.RELEASE
    package org.springframework.boot.autoconfigure.transaction;
    
    //    imports
    
    
    @Configuration
    //     PlatformTransactionManager     classpath     
    @ConditionalOnClass(PlatformTransactionManager.class)
    //               
    @AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
    		DataSourceTransactionManagerAutoConfiguration.class,
    		Neo4jDataAutoConfiguration.class })
    //       spring.transaction                bean TransactionProperties
    @EnableConfigurationProperties(TransactionProperties.class)
    public class TransactionAutoConfiguration {
    
    	//    bean TransactionManagerCustomizers platformTransactionManagerCustomizers
    	@Bean
    	//     bean        
    	@ConditionalOnMissingBean
    	public TransactionManagerCustomizers platformTransactionManagerCustomizers(
    			ObjectProvider<PlatformTransactionManagerCustomizer<?>> customizers) {
    		return new TransactionManagerCustomizers(
    				customizers.orderedStream().collect(Collectors.toList()));
    	}
    
    	//      
    	@Configuration
    	//        PlatformTransactionManager bean     
    	@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
    	public static class TransactionTemplateConfiguration {
    
    		private final PlatformTransactionManager transactionManager;
    
    		public TransactionTemplateConfiguration(
    				PlatformTransactionManager transactionManager) {
    			this.transactionManager = transactionManager;
    		}
    
    		//    bean TransactionTemplate transactionTemplate
    		@Bean
    		//     bean        
    		@ConditionalOnMissingBean
    		public TransactionTemplate transactionTemplate() {
    			return new TransactionTemplate(this.transactionManager);
    		}
    
    	}
    
    	//      
    	@Configuration
    	//    bean PlatformTransactionManager       
    	@ConditionalOnBean(PlatformTransactionManager.class)
    	//    bean AbstractTransactionManagementConfiguration        
    	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
    	public static class EnableTransactionManagementConfiguration {
    
    		//       
    		//     spring.aop.proxy-target-class        false       
    		// @EnableTransactionManagement(proxyTargetClass = false)
    		@Configuration        
    		@EnableTransactionManagement(proxyTargetClass = false)
    		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", 
    			matchIfMissing = false)
    		public static class JdkDynamicAutoProxyConfiguration {
    
    		}
    
    		//       
    		//     spring.aop.proxy-target-class            true       
    		// @EnableTransactionManagement(proxyTargetClass = true)
    		@Configuration
    		@EnableTransactionManagement(proxyTargetClass = true)
    		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", 
    			matchIfMissing = true)
    		public static class CglibAutoProxyConfiguration {
    
    		}
    
    	}
    
    }