Spring 事务源码

90 阅读1分钟

开启事务

配置文件中写入<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

  1. InfrastructureAdvisorAutoProxyCreator
    与AOP源码中AnnotationAwareAspectJAutoProxyCreator的作用相似,主要区别在于对@AspectJ 系列注解的支持,如果同时配置了AOP与事务,AnnotationAwareAspectJAutoProxyCreator会覆盖InfrastructureAdvisorAutoProxyCreator,优先级细节见AopConfigUtils.registerOrEscalateApcAsRequired()源码`
  1. BeanFactoryTransactionAttributeSourceAdvisor
    Advisor的实现类,内置了TransactionInterceptorAnnotationTransactionAttributeSource

  2. AnnotationTransactionAttributeSource AopUtils.findAdvisorsThatCanApply方法会通过调用BeanFactoryTransactionAttributeSourceAdvisor调用该类的 getTransactionAttribute方法判断事务是否适用目标类

  3. TransactionInterceptor 事务的具体实现类,继承了MethodInterceptor接口,使用其中invoke方法实现事务

事务匹配

事务 适用验证.png

事务增强

事务 增强.png