文章目录
概览
事物执行流程
类与类的交互
TransactionInterceptor
: 事物代理入口
TransactionAttributeSource
:事物方法扫描、注解信息解析
TransactionManager
:持有连接信息,负责事物开启、回滚、savepoint等
初始化
TransactionAutoConfiguration
: 引入TransactionManagementConfigurationSelector
以及代理模式
TransactionManagementConfigurationSelector
:引入ProxyTransactionManagementConfiguration
ProxyTransactionManagementConfiguration
:生成BeanFactoryTransactionAttributeSourceAdvisor
、TransactionInterceptor
、TransactionAttributeSource
到容器中
BeanFactoryTransactionAttributeSourceAdvisor
:持有TransactionInterceptor
、TransactionAttributeSource
。作为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
容器:AutoProxyRegistrar
跟ProxyTransactionManagementConfiguration
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
注册用于事物管理的BeanFactoryTransactionAttributeSourceAdvisor
到Spring
容器中,生成代理对象时注入该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