springboot10--->spring-boot自动配置事务管理器的原理分析

1、使用事务方式1--->基于xml配置aop切面来提供事务功能:

      1.1、配置数据源:

     <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="user" value="${jdbc.user}"></property>
         <property name="password" value="${jdbc.password}"></property>
         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
         <property name="driverClass" value="${jdbc.driverClass}"></property>
     </bean>

      1.2、配置事务管理器

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="pooledDataSource"></property>
      </bean>

      1.3、配置事务切面的增强

     <tx:advice id="myAdvice" transaction-manager="transactionManager">
              <!--事务属性  -->
              <tx:attributes>
                 <!-- 指明哪些方法是事务方法;切入点表达式只是说,事务管理器要切入这些方法,
                 哪些方法加事务使用tx:method指定的 -->
                  <tx:method name="*"/>
                  <tx:method name="checkout" propagation="REQUIRED" timeout="-1"/>
                  <tx:method name="get*" read-only="true"/>
              </tx:attributes>
     </tx:advice>

      1.4、配置事务切面

              增强有了,还缺少切点point,如下定义切点以及切面;

      <aop:config>
          <aop:pointcut expression="execution(* com.atguigu.service.**.*(..))" id="txPoint"/>
          <!-- 事务建议;事务增强     advice-ref:指定曾强 -->
          <aop:advisor advice-ref="myAdvice" pointcut-ref="txPoint"/>
      </aop:config>

      这样就完成了基于xml的事务功能声明了。

 

2、使用事务方式1--->基于注解来声明事务

      2.1、配置数据源:

     <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="user" value="${jdbc.user}"></property>
         <property name="password" value="${jdbc.password}"></property>
         <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
         <property name="driverClass" value="${jdbc.driverClass}"></property>
     </bean>

      2.2、配置事务管理器:

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="pooledDataSource"></property>
      </bean>

      2.3、开启事务注解驱动:

   <tx:annotation-driven 
      transaction-manager="transactionManager" 
      order="2" 
      proxy-target-class="true" 
      mode="aspectj"
   />

         <tx:annotation-driven 标签核心属性:

                 1、transaction-manager:指定事务管理器,默认就是"transactionManager"。

                 2、order:事务切面的顺序,数字越大执行越靠后。

                 3、proxy-target-class:是否代理类而不是代理接口,默认是fasle指可以代理接口。

                 4、mode:代理模式,有两种,一种是"proxy" ,另外一种是"aspectj"。

 

       2.4、基于注解@Transactional使用事务功能

                在需要使用事务的方法上标如下注解:@Transactional(readOnly = false, transactionManager = "transactionManager", timeout = 1000, rollbackFor = RuntimeException.class, noRollbackFor = XxxException.class)

 

3、springboot 又是如何自动配置事务功能的呢???

      老规矩我们来到spring-boot-autoconfigure包下面的spring.factories文件中,我们来查找事务相关的自动配置类,找到的配置类列表如下:

org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\ 
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\

  我们主要关注的是TransactionAutoConfiguration这个配置类,它表示事务自动配置,我们查看其源码如下:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(PlatformTransactionManager.class)

需要在事务管理器实例配置完成后才能激活当前事务的自动装配类,
也就是说会先配置一个事务管理器transactionManager实例,
然后才会去配置事务的切面。

@AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
		DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean
	public TransactionManagerCustomizers platformTransactionManagerCustomizers(
			ObjectProvider<PlatformTransactionManagerCustomizer<?>> customizers) {
		return new TransactionManagerCustomizers(customizers.orderedStream().collect(Collectors.toList()));
	}

	@Bean
	@ConditionalOnMissingBean
	@ConditionalOnSingleCandidate(ReactiveTransactionManager.class)
	public TransactionalOperator transactionalOperator(ReactiveTransactionManager transactionManager) {
		return TransactionalOperator.create(transactionManager);
	}

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
	public static class TransactionTemplateConfiguration {

		@Bean
		@ConditionalOnMissingBean(TransactionOperations.class)
		public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
			return new TransactionTemplate(transactionManager);
		}

	}

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnBean(TransactionManager.class)
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
    启用事务管理配置类,在这类里面添加了两个配置类,分别是JdkDynamicAutoProxyConfiguration、
CglibAutoProxyConfiguration 且上面都标注了注解@EnableTransactionManagement,这个注解的作用就
跟注解驱动标签<tx:annotation-driven的功能一摸一样,因此其实spring boot自动配置事务的方式也就是
在变相的使用<tx:annotation-driven。

	public static class EnableTransactionManagementConfiguration {

		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = false)
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
				matchIfMissing = false)
		public static class JdkDynamicAutoProxyConfiguration {

		}

		@Configuration(proxyBeanMethods = false)
		@EnableTransactionManagement(proxyTargetClass = true)
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
				matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {

		}

	}

}

   由上面我们知道了,想要使用spring提供的事务功能,必须具备如下组件:

       第1个:事务管理器:负责对事务的管理,比如开启、提交、回滚事务等操作。

       第2个:事务切面:定义事务的特性、以及定义需要提供事务的方法信息。

       在事务的自动配置类 TransactionAutoConfiguration 上面标注的注解: @AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })就是提供第1个组件的支持。

       而激活TransactionAutoConfiguration后配置的JdkDynamicAutoProxyConfiguration或者CglibAutoProxyConfiguration配置类上的注解@EnableTransactionManagement所做的就是提供第2个组件的支持。

 

4、以上就是spring boot中自动配置事务的原理

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值