Spring声明式事务控制
声明式事务很方便,尤其纯注解模式,仅仅几个注解就能控制事务了 思考:这些注解都做了什么?好神奇! @EnableTransactionManagement @Transactional

@EnableTransactionManagement

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Import(TransactionManagementConfigurationSelector.class)
  5. public @interface EnableTransactionManagement {

@EnableTransactionManagement 注解使用 @Import 标签引入了 TransactionManagementConfigurationSelector类,这个类又向容器中导入了两个重要的组

image.png

image.png

加载事务控制组件

AutoProxyRegistrar AutoProxyRegistrar 类的 registerBeanDefinitions 方法中又注册了一个组件
image.png

image.png

进入 AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法
image.png
image.png
发现最终,注册了一个叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而这个类是 AbstractAutoProxyCreator 的子类,实现了 SmartInstantiationAwareBeanPostProcessor 接口

  1. public class InfrastructureAdvisorAutoProxyCreator extends
  2. AbstractAdvisorAutoProxyCreator
  3. public abstract class AbstractAdvisorAutoProxyCreator extends
  4. AbstractAutoProxyCreator
  5. public abstract class AbstractAutoProxyCreator extends
  6. ProxyProcessorSupport
  7. implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

进入到InfrastructureAdvisorAutoProxyCreator 类,按Ctrl+Shift +Alt +u看看结构图
image.png

它实现了SmartInstantiationAwareBeanPostProcessor,说明这是⼀个后置处理器,⽽且跟 spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实 现的是同⼀个接⼝,所以说,声明式事务是 springAOP 思想的一种应用

ProxyTransactionManagementConfiguration 组件

image.png

ProxyTransactionManagementConfiguration是⼀个容器配置类,注册了⼀个组件 transactionAdvisor,称为事务增强器,然后在这个事务增强器中⼜注⼊了两个属性: transactionAttributeSource,即属性解析器transactionAttributeSource 和 事务拦截器 transactionInterceptor

上述组件如何关联起来的? 事务拦截器实现了MethodInterceptor接⼝,追溯⼀下上⾯提到的 InfrastructureAdvisorAutoProxyCreator后置处理器,它会在代理对象执⾏⽬标⽅法的时候 获取其拦截器链,⽽拦截器链就是这个TransactionInterceptor,这就把这两个组件联系起 来; 构造⽅法传⼊PlatformTransactionManager(事务管理器)、TransactionAttributeSource(属 性解析器),但是追溯⼀下上⾯贴的ProxyTransactionManagementConfiguration的源码, 在注册事务拦截器的时候并没有调⽤这个带参构造⽅法,⽽是调⽤的⽆参构造⽅法,然后再 调⽤set⽅法注⼊这两个属性,效果⼀样。 invokeWithinTransaction ⽅法,部分源码如下(关注1、2、3、4 标注处)

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

死磕Spring源码-Spring事务源码深度剖析_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
9月最新Spring事务底层原理分析全集_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
Spring的声明式事务底层原理_蓝田日暖玉生烟-CSDN博客
Spring源码教程视频全集56集(2020大厂必备)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili