文章目录
概览
事物执行流程

类与类的交互
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 transactionInterceptor) {

最低0.47元/天 解锁文章
4525

被折叠的 条评论
为什么被折叠?



