spring事务源码分析
说到事务就离不开两个注解EnableTransactionManagement和 @Transactional注解。注意:如果光加@Transactional而没有EnableTransactionManagement事务是不生效的
@EnableTransactionManagement其中采用了import机制,引入了TransactionManagementConfigurationSelector类。这个import机制常常用来引入第三方的插件
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;
}
}
@EnableTransactionManagement默认的adviceMode为PROXY,
这个import引入了两个类到spring容器中AutoProxyRegistrar和ProxyTransactionManagementConfiguration
- 先看AutoProxyRegistrar这个类的作用
这个类是ImportBeanDefinitionRegistrar的子类,用于向容器中自定义添加beanDefinition。
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean candidateFound = false;
Set<String> annTypes = importingClassMetadata.getAnnotationTypes();
for (String annType : annTypes) {
AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annType);
if (candidate == null) {
continue;
}
Object mode = candidate.get("mode");
Object proxyTargetClass = candidate.get("proxyTargetClass");
if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass() &&
Boolean.class == proxyTargetClass.getClass()) {
candidateFound = true;
if (mode == AdviceMode.PROXY) {
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
if ((Boolean) proxyTargetClass) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
return;
}
}
}
}
}
主要是注册了一个BeanDefinition 类型为InfrastructureAdvisorAutoProxyCreator,其实SmartInstantiationAwareBeanPostProcessor的子类,基于spring的beanPostprocessor机制,是用于在bean创建的过程中对bean做增强用的。在我们具体的bean创建期间再说。类似于aop
- ProxyTransactionManagementConfiguration
@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
}
这个类就是一个简单的配置类,我们先看其父类AbstractTransactionManagementConfiguration
@Configuration
public abstract class AbstractTransactionManagementConfiguration implements ImportAware {
@Nullable
protected AnnotationAttributes enableTx;
/**
* Default transaction manager, as configured through a {@link TransactionManagementConfigurer}.
*/
@Nullable
protected PlatformTransactionManager txManager;
@Override
public void setImportMetadata(AnnotationMetadata importMetadata) {
this.enableTx