Spring声明式事务控制
声明式事务很方便,尤其纯注解模式,仅仅几个注解就能控制事务了 思考:这些注解都做了什么?好神奇! @EnableTransactionManagement @Transactional
@EnableTransactionManagement
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
@EnableTransactionManagement 注解使用 @Import 标签引入了 TransactionManagementConfigurationSelector类,这个类又向容器中导入了两个重要的组
加载事务控制组件
AutoProxyRegistrar AutoProxyRegistrar 类的 registerBeanDefinitions 方法中又注册了一个组件
进入 AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法
发现最终,注册了一个叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而这个类是 AbstractAutoProxyCreator 的子类,实现了 SmartInstantiationAwareBeanPostProcessor 接口
public class InfrastructureAdvisorAutoProxyCreator extends
AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends
AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends
ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
进入到InfrastructureAdvisorAutoProxyCreator 类,按Ctrl+Shift +Alt +u看看结构图
它实现了SmartInstantiationAwareBeanPostProcessor,说明这是⼀个后置处理器,⽽且跟 spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实 现的是同⼀个接⼝,所以说,声明式事务是 springAOP 思想的一种应用
ProxyTransactionManagementConfiguration 组件
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