开启事务
配置文件中写入<tx:annotation-dirven transaction-manager="transactionManager"/>即可开启事务。
spring会调用
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
@Override
@Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) {
registerTransactionalEventListenerFactory(parserContext);
String mode = element.getAttribute("mode");
if ("aspectj".equals(mode)) {
// mode="aspectj"
registerTransactionAspect(element, parserContext);
if (ClassUtils.isPresent("javax.transaction.Transactional", getClass().getClassLoader())) {
registerJtaTransactionAspect(element, parserContext);
}
}
else {
// mode="proxy" 重点
AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext);
}
return null;
}
}
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private static class AopAutoProxyConfigurer {
public static void configureAutoProxyCreator(Element element, ParserContext parserContext) {
//1. 注册InfrastructureAdvisorAutoProxyCreator 类型的Bean
AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
String txAdvisorBeanName = "org.springframework.transaction.config.internalTransactionAdvisor";
if (!parserContext.getRegistry().containsBeanDefinition(txAdvisorBeanName)) {
Object eleSource = parserContext.extractSource(element);
//2. 创建AnnotationTransactionAttributeSource 类型的Bean
RootBeanDefinition sourceDef = new RootBeanDefinition("org.springframework.transaction.annotation.AnnotationTransactionAttributeSource");
sourceDef.setSource(eleSource);
sourceDef.setRole(2);
//3. 注册AnnotationTransactionAttributeSource Bean,并生成特定格式BeanName
String sourceName = parserContext.getReaderContext().registerWithGeneratedName(sourceDef);
//4. 创建TransactionInterceptor 类型的Bean
RootBeanDefinition interceptorDef = new RootBeanDefinition(TransactionInterceptor.class);
interceptorDef.setSource(eleSource);
interceptorDef.setRole(2);
AnnotationDrivenBeanDefinitionParser.registerTransactionManager(element, interceptorDef);
interceptorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));
//5. 注册TransactionInterceptor Bean , 并生成特定格式BeanName
String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef);
//6. 创建BeanFactoryTransactionAttributeSourceAdvisor 类型的Bean
RootBeanDefinition advisorDef = new RootBeanDefinition(BeanFactoryTransactionAttributeSourceAdvisor.class);
advisorDef.setSource(eleSource);
advisorDef.setRole(2);
//7. 将前两个Bean 引入BeanFactoryTransactionAttributeSourceAdvisor 中,可在该类中通过特定格式BeanName中可以调用
advisorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));
advisorDef.getPropertyValues().add("adviceBeanName", interceptorName);
if (element.hasAttribute("order")) {
advisorDef.getPropertyValues().add("order", element.getAttribute("order"));
}
parserContext.getRegistry().registerBeanDefinition(txAdvisorBeanName, advisorDef);
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), eleSource);
compositeDef.addNestedComponent(new BeanComponentDefinition(sourceDef, sourceName));
compositeDef.addNestedComponent(new BeanComponentDefinition(interceptorDef, interceptorName));
compositeDef.addNestedComponent(new BeanComponentDefinition(advisorDef, txAdvisorBeanName));
parserContext.registerComponent(compositeDef);
}
}
}
}
主要创建了四个Bean
- InfrastructureAdvisorAutoProxyCreator
与AOP源码中AnnotationAwareAspectJAutoProxyCreator的作用相似,主要区别在于对@AspectJ 系列注解的支持,如果同时配置了AOP与事务,AnnotationAwareAspectJAutoProxyCreator会覆盖InfrastructureAdvisorAutoProxyCreator,优先级细节见AopConfigUtils.registerOrEscalateApcAsRequired()源码`
-
BeanFactoryTransactionAttributeSourceAdvisor
Advisor的实现类,内置了TransactionInterceptor和AnnotationTransactionAttributeSource -
AnnotationTransactionAttributeSource
AopUtils.findAdvisorsThatCanApply方法会通过调用BeanFactoryTransactionAttributeSourceAdvisor调用该类的getTransactionAttribute方法判断事务是否适用目标类 -
TransactionInterceptor 事务的具体实现类,继承了
MethodInterceptor接口,使用其中invoke方法实现事务