springboot事务回滚源码_SpringBoot 源码解析 (八)----- Spring Boot 精髓:事务源码解析...

本文详细解析了SpringBoot如何自动开启和管理事务,从导入jdbc依赖到SpringBoot自动配置DataSourceTransactionManager,再到TransactionAutoConfiguration启用@EnableTransactionManagement注解。通过源码分析,揭示了SpringBoot在使用jdbcTemplate、jpa或Mybatis等ORM框架时,如何简化事务管理的过程。
摘要由CSDN通过智能技术生成

本篇来讲一下SpringBoot是怎么自动开启事务的,我们先来回顾一下以前SSM中是如何使用事务的

SSM使用事务

导入JDBC依赖包

众所周知,凡是需要跟数据库打交道的,基本上都要添加jdbc的依赖,在Spring项目中,加入的是spring-jdbc依赖:

org.springframework

spring-jdbc

配置版事务

在使用配置文件的方式中,通常会在Spring的配置文件中配置事务管理器,并注入数据源:

接下来可以直接在业务层Service的方法上或者类上添加@Transactional。

注解版事务

首先需要注册两个Bean,分别对应上面Spring配置文件中的两个Bean:

@EnableTransactionManagement//重要

@Configurationpublic classTxConfig {

@BeanpublicDataSource dataSource() {

ComboPooledDataSource dataSource= newComboPooledDataSource();

dataSource.setUser("...");

dataSource.setPassword("...");

dataSource.setDriverClass("...");

dataSource.setJdbcUrl("...");returndataSource;

}//重要

@BeanpublicPlatformTransactionManager platformTransactionManager() {return new DataSourceTransactionManager(dataSource());//放入数据源}

}

我们看到往Spring容器中注入了DataSource 和PlatformTransactionManager 对象,并且通过@EnableTransactionManagement注解开启了事务,和上面的XML配置是一一对应的。PlatformTransactionManager这个Bean非常重要,要使用事务管理,就必须要在IOC容器中注册一个事务管理器。

public interfacePlatformTransactionManager {//获取一个Transaction

TransactionStatus getTransaction(TransactionDefinition var1) throwsTransactionException;//提交事务

void commit(TransactionStatus var1) throwsTransactionException;//回滚事务

void rollback(TransactionStatus var1) throwsTransactionException;

}

我们看到事务管理器的作用就是获取事务,提交回滚事务。DataSourceTransactionManager是PlatformTransactionManager的一个实现类,大家可以看看我以前的文章spring5 源码深度解析----- Spring事务 是怎么通过AOP实现的?(100%理解Spring事务) 看一下Spring的声明式事务的源码。下面我们来看看SpringBoot是如何自动配置事务的

SpringBoot自动配置事务

引入JDBC

众所周知,在SpringBoot中凡是需要跟数据库打交道的,基本上都要显式或者隐式添加jdbc的依赖:

org.springframework.boot

spring-boot-starter-jdbc

也就是jdbc的场景启动器,我们点进去看看

20191125111143612xnjclcobbok1szb_2.png

其实也是引入了spring-jdbc的依赖,接下来我们要看两个重要的事务自动配置类

DataSourceTransactionManagerAutoConfiguration

20191125111143612xnjclcobbok1szb_3.png

我们看到在spring.factories中配置了事务管理器自动配置类DataSourceTransactionManagerAutoConfiguration,我们进去看看

@Configuration //在类路径下有这个类存在PlatformTransactionManager时,这个配置类才会生效 //而前面我们已经引入了spring-boot-starter-jdbc,那自然是存在了

@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class}) @AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE) @EnableConfigurationProperties(DataSourceProperties.class) public classDataSourceTransactionManagerAutoConfiguration {

@Configuration @ConditionalOnSingleCandidate(DataSource.class) static classDataSourceTransactionManagerConfiguration {

private finalDataSource dataSource;

private finalTransactionManagerCustomizers transactionManagerCustomizers;

DataSourceTransactionManagerConfiguration(DataSource dataSource, ObjectProvidertransactionManagerCustomizers) { this.dataSource =dataSource; this.transactionManagerCustomizers =transactionManagerCustomizers .getIfAvailable(); }

@Bean //没有当Spring容器中不存在PlatformTransactionManager这个对象时,创建DataSourceTransactionManager //也就是如果我们自定义了DataSourceTransactionManager并注入Spring容器,这里将不会执行

@ConditionalOnMissingBean(PlatformTransactionManager.class) publicDataSourceTransactionManager transactionManager(DataSourceProperties properties) { //创建DataSourceTransactionManager注入Spring容器,并且把dataSource传进去

DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource); if (this.transactionManagerCustomizers != null) { this.transactionManagerCustomizers.customize(transactionManager); } returntransactionManager; }

}

}

很明显只要我们导入了spring-boot-starter-jdbc场景启动器,并且我们没有自定义DataSourceTransactionManager,那么事务管理器自动配置类DataSourceTransactionManagerAutoConfiguration会自动为我们创建DataSourceTransactionManager并注入Spring容器中。但是这还不够,我们前面还是需要通过@EnableTransactionManagement开启事务呢,如果不开启事务,@Transactional是不起任何作用的。下面我们就来看看是如何开启事务的

TransactionAutoConfiguration

20191125111143612xnjclcobbok1szb_1.png

我们看到在spring.factories中配置了事务自动开启配置类TransactionAutoConfiguration,我们进去看看

@Configuration //和DataSourceTransactionManagerAutoConfiguration中是一样的 //引入了spring-boot-starter-jdbc,那自然是存在了PlatformTransactionManager

@ConditionalOnClass({PlatformTransactionManager.class})//这个自动配置类必须要在DataSourceTransactionManagerAutoConfiguration这个自动配置类之后才能生效 //也就是前面我们已经往Spring容器中注入了DataSourceTransactionManager这个对象才执行这个配置类

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

@Configuration @ConditionalOnBean({PlatformTransactionManager.class}) @ConditionalOnMissingBean({AbstractTransactionManagementConfiguration.class}) public static classEnableTransactionManagementConfiguration { publicEnableTransactionManagementConfiguration() { }

@Configuration //重点:通过 @EnableTransactionManagement注解开启事务 //可以看到和我们自己使用@EnableTransactionManagement是一样的

@EnableTransactionManagement( proxyTargetClass = true

) @ConditionalOnProperty( prefix = "spring.aop", name = {"proxy-target-class"}, havingValue = "true", matchIfMissing = true

) public static classCglibAutoProxyConfiguration { publicCglibAutoProxyConfiguration() { } }

@Configuration @EnableTransactionManagement( proxyTargetClass = false

) @ConditionalOnProperty( prefix = "spring.aop", name = {"proxy-target-class"}, havingValue = "false", matchIfMissing = false

) public static classJdkDynamicAutoProxyConfiguration { publicJdkDynamicAutoProxyConfiguration() { } } }

@Configuration @ConditionalOnSingleCandidate(PlatformTransactionManager.class) public static classTransactionTemplateConfiguration { private finalPlatformTransactionManager transactionManager;

publicTransactionTemplateConfiguration(PlatformTransactionManager transactionManager) { this.transactionManager =transactionManager; }

@Bean @ConditionalOnMissingBean publicTransactionTemplate transactionTemplate() { return new TransactionTemplate(this.transactionManager); } } }

我们看到TransactionAutoConfiguration这个自动配置类必须要在DataSourceTransactionManagerAutoConfiguration这个配置类之后才能生效,也就是前面我们已经往Spring容器中注入了DataSourceTransactionManager这个对象才执行这个配置类,然后通过

@EnableTransactionManagement这个注解开启事务,其实和我们自己使用@EnableTransactionManagement是一样的

因此,只要我们在SpringBoot中引入了spring-boot-starter-jdbc这个场景启动器,就会帮我们自动开启事务了,我们只需要使用@Transactional就可以了

mybatis-spring-boot-starter

大多数时候我们在SpringBoot中会引入Mybatis这个orm框架,Mybaits的场景启动器如下

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.0

我们点进去看看

20191125111143612xnjclcobbok1szb_0.png

我们看到mybatis-spring-boot-starter这个场景启动器是引入了spring-boot-starter-jdbc这个场景启动器的,因此只要我们在SpringBoot中使用Mybaits,是自动帮我们开启了Spring事务的

总结

springboot 开启事物很简单,只需要加一行注解@Transactional就可以了,前提你用的是jdbctemplate, jpa, Mybatis,这种常见的orm。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值