Spring源码分析之事物管理

概览

事物执行流程

在这里插入图片描述

类与类的交互

TransactionInterceptor: 事物代理入口

TransactionAttributeSource :事物方法扫描、注解信息解析

TransactionManager:持有连接信息,负责事物开启、回滚、savepoint等

在这里插入图片描述

初始化

TransactionAutoConfiguration: 引入TransactionManagementConfigurationSelector以及代理模式

TransactionManagementConfigurationSelector:引入ProxyTransactionManagementConfiguration

ProxyTransactionManagementConfiguration:生成BeanFactoryTransactionAttributeSourceAdvisorTransactionInterceptorTransactionAttributeSource到容器中

BeanFactoryTransactionAttributeSourceAdvisor:持有TransactionInterceptorTransactionAttributeSource。作为Advisor用于生成代理对象

AnnotationAwareAspectJAutoProxyCreator 根据Advisor定义的切面信息对目标bean进行代理

DataSourceTransactionManagerAutoConfiguration: 生成TransactionManager

源码分析

1. 注册Advisor

TransactionAutoConfiguration通过Import引入TransactionManagementConfigurationSelector

@AutoConfiguration(after = {
    JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
		DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class })
@ConditionalOnClass(PlatformTransactionManager.class)
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {
   

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnBean(TransactionManager.class)
	@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)
	public static class EnableTransactionManagementConfiguration {
   
		
		@Configuration(proxyBeanMethods = false)
		//默认采用代理的方式,这种方式模式下,被代理类内部的本地调用不会走代理,意味着Spring事物管理不会介入
		@EnableTransactionManagement(proxyTargetClass = true)
		@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
				matchIfMissing = true)
		public static class CglibAutoProxyConfiguration {
   

		}

	}
}

@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
   
}

TransactionManagementConfigurationSelector引入两个类到Spring容器:AutoProxyRegistrarProxyTransactionManagementConfiguration

AutoProxyRegistrar负责生成代理对象的PostProcessor的注册,这个跟之前Spring AOP里的AnnotationAwareAspectJAutoProxyCreator都继承自AbstractAutoProxyCreator,如果Spring已经注册了AnnotationAwareAspectJAutoProxyCreator,则会避免后续AbstractAutoProxyCreator的子类的注册

ProxyTransactionManagementConfiguration负责生成拦截器

public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
   	
	@Override
	protected String[] selectImports(AdviceMode adviceMode) {
   
		switch (adviceMode) {
   
			case PROXY:
				return new String[] {
   AutoProxyRegistrar.class.getName(),
						ProxyTransactionManagementConfiguration.class.getName()};
			case ASPECTJ:
				return new String[] {
   determineTransactionAspectClass()};
			default:
				return null;
		}
	}
}

ProxyTransactionManagementConfiguration注册用于事物管理的BeanFactoryTransactionAttributeSourceAdvisorSpring容器中,生成代理对象时注入该advisor

@Configuration(proxyBeanMethods = false)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
   

	@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor(
			TransactionAttributeSource transactionAttributeSource, TransactionInterceptor transactionInterce
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值