Spring源码解析:(八)事务管理

事务管理

  • 前言
  • spring的事务传播级别
    • Spring中事务的API
  • 事务的源码实现
    • @EnableTransactionManagement
      • AutoProxyRegistrar
  • 总结

前言

本节主要讲讲Sring的事务管理方面,关于事务管理相信大多读者也都有了解和使用,关于数据库方面的事务管理本节就不再叙述,读者可以看本人的mysql方面的文章浅谈Mysql事务

spring的事务传播级别

事务往往在service层进行控制,如果出现service层方法A调用了另外一个service层方法B,A和B方法本
身都已经被添加了事务控制,那么A调用B的时候,就需要进行事务的一些协商,这就叫做事务的传播行
为。
A调用B,我们站在B的⻆度来观察来定义事务的传播行为
Spring源码解析:(八)事务管理_第1张图片

Spring中事务的API

PlatformTransactionManager

public interface PlatformTransactionManager {
/**
* 获取事务状态信息
*/
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)throws TransactionException;
/**
* 提交事务
*/
void commit(TransactionStatus status) throws TransactionException;
/**
* 回滚事务
*/
void rollback(TransactionStatus status) throws TransactionException;
}

作用
此接⼝是Spring的事务管理器核心接口。Spring本身并不支持事务实现,只是负责提供标准,应用底层支持什么样的事务,需要提供具体实现类。此处也是策略模式的具体应用。在Spring框架中,也为我们内置了一些具体策略,例如:DataSourceTransactionManager , HibernateTransactionManager 等等。( 和 HibernateTransactionManager 事务管理器在 spring-orm-5.1.12.RELEASE.jar 中)
Spring JdbcTemplate(数据库操作工具)、Mybatis(mybatis-spring.jar)————>
DataSourceTransactionManager
Hibernate框架 ——————> HibernateTransactionManager
DataSourceTransactionManager 归根结底是横切逻辑代码,声明式事务要做的就是使用Aop(动态代理)来将事务控制逻辑织入到业务代码

使用事务在 Spring 的配置类上添加 @EnableTransactionManagement 注解即可

事务的源码实现

实现事务只需要@EnableTransactionManagement @Transactional两个注解即可,所以就探究下这两个注解的实现思想和原理。

@EnableTransactionManagement

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {

@EnableTransactionManagement 注解使⽤ @Import 标签引用了
TransactionManagementConfigurationSelector类,这个类又向容器中导入了两个重要的组件
Spring源码解析:(八)事务管理_第2张图片
接下来就继续研究这两个关键组件

AutoProxyRegistrar

AutoProxyRegistrar 类的 registerBeanDefinitions 方法中又注册了一个组件
Spring源码解析:(八)事务管理_第3张图片
进入AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法
Spring源码解析:(八)事务管理_第4张图片
发现最终,注册了一个叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而这个类是
AbstractAutoProxyCreator 的子类,实现了 SmartInstantiationAwareBeanPostProcessor 接口

public class InfrastructureAdvisorAutoProxyCreator extends
AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends
AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends
ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

继承体系结构图如下
Spring源码解析:(八)事务管理_第5张图片
它实现了SmartInstantiationAwareBeanPostProcessor,说明这是一个后置处理器,而且跟
spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实
现的是同一个接口,所以说,声明式事务是 springAOP 思想的一种应用

ProxyTransactionManagementConfiguration 组件

  /**
     * {@code @Configuration} class that registers the Spring infrastructure
     beans
     * necessary to enable proxy-based annotation-driven transaction
     management.
     *
     * @author Chris Beams
     * @since 3.1
     * @see EnableTransactionManagement
     * @see TransactionManagementConfigurationSelector
     */
    @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 部分源码如下
Spring源码解析:(八)事务管理_第6张图片
属性解析器有一个成员变量是annotationParsers,是一个集合,可以添加多种注解解析器
(TransactionAnnotationParser),我们关注 Spring 的注解解析器,部分源码如下
Spring源码解析:(八)事务管理_第7张图片
属性解析器的作用之一就是用来解析@Transaction注解

TransactionInterceptor 事务拦截器,部分源码如下
在这里插入图片描述
上述组件如何关联:

  1. 事务拦截器实现了MethodInterceptor接口,追溯一下上面提到InfrastructureAdvisorAutoProxyCreator后置处理器,它会在代理对象执行目标方法的时候获取其拦截器链,而拦截器链就是这个TransactionInterceptor,这就把这两个组件联系起来;
  2. 构造方法传入PlatformTransactionManager(事务管理器)、TransactionAttributeSource(属
    性解析器),但是追溯一下上面贴的ProxyTransactionManagementConfiguration的源码,
    在注册事务拦截器的时候并没有调用这个带参构造方法,而是调用的无参构造方法,然后再
    调用set方法注入这两个属性,效果一样。
    invokeWithinTransaction 方法,部分源码如下
    Spring源码解析:(八)事务管理_第8张图片
    Spring源码解析:(八)事务管理_第9张图片

总结

总结下事务的调用流程

@EnableTransactionManagement 注解
1)通过@import引入了TransactionManagementConfigurationSelector类
它的selectImports方法导入了另外两个类:AutoProxyRegistrar和ProxyTransactionManagementConfiguration
2)AutoProxyRegistrar类分析
方法registerBeanDefinitions中,引入了其他类,通过AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry)引入InfrastructureAdvisorAutoProxyCreator,它继承了AbstractAutoProxyCreator,是一个
后置处理器类
3)ProxyTransactionManagementConfiguration 是一个添加了@Configuration注解的配置类(注册bean)
注册事务增强器(注入属性解析器、事务拦截器)
属性解析器:AnnotationTransactionAttributeSource,内部持有了一个解析器集合
Set<TransactionAnnotationParser> annotationParsers;
具体使用的是SpringTransactionAnnotationParser解析器,用来解析
@Transactional的事务属性
事务拦截器:TransactionInterceptor实现了MethodInterceptor接口,该通用拦截会在产生代理对象之前和aop增强合并,最终引起影响到代理对象TransactionInterceptor的invoke方法中invokeWithinTransaction会触发原有业务逻辑调口(增强事务)

你可能感兴趣的:(Spring)