美文网首页
Spring中@Transactional注解到底做了什么(二)

Spring中@Transactional注解到底做了什么(二)

作者: 夜流星_9775 | 来源:发表于2020-04-18 10:36 被阅读0次

    这一章我们来看看事务的具体参数在项目启动后,是在哪个入口加载和解析的

    入口

    TxNamespaceHandler类,TxNamespaceHandler类是spring-tx包的自定义解析器,在它的init方法中,有一个AnnotationDrivenBeanDefinitionParser类,

        @Override
        public void init() {
            registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
            //<tx:annotation-driven开头的配置, Spring会使用AnnotationDrivenBeanDefinitionParser类的 parse方法进行解析
            registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
            registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
        }
    

    再看AnnotationDrivenBeanDefinitionParser类中的parse方法

        @Override
        @Nullable
        public BeanDefinition parse(Element element, ParserContext parserContext) {
            registerTransactionalEventListenerFactory(parserContext);
            String mode = element.getAttribute("mode");
            if ("aspectj".equals(mode)) {
                //类型为"aspectj"
                registerTransactionAspect(element, parserContext);
                if (ClassUtils.isPresent("javax.transaction.Transactional", getClass().getClassLoader())) {
                    registerJtaTransactionAspect(element, parserContext);
                }
            }
            else {
                //类型为"proxy" 默认
                AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext);
            }
            return null;
        }
    
    private static class AopAutoProxyConfigurer {
    
            public static void configureAutoProxyCreator(Element element, ParserContext parserContext) {
                AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
    
                String txAdvisorBeanName = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME;
                if (!parserContext.getRegistry().containsBeanDefinition(txAdvisorBeanName)) {
                    Object eleSource = parserContext.extractSource(element);
    
                    // Create the TransactionAttributeSource definition.
                    //创建TransactionAttributeSource的bean
                    RootBeanDefinition sourceDef = new RootBeanDefinition(
                            "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource");
                    sourceDef.setSource(eleSource);
                    sourceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                    String sourceName = parserContext.getReaderContext().registerWithGeneratedName(sourceDef);
    
                    // Create the TransactionInterceptor definition.
                    //创建TransactionInterceptor的bean 后面使用TransactionInterceptor作为事务增强器实现事务的逻辑
                    RootBeanDefinition interceptorDef = new RootBeanDefinition(TransactionInterceptor.class);
                    interceptorDef.setSource(eleSource);
                    interceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                    registerTransactionManager(element, interceptorDef);
                    interceptorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));
                    String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef);
    
                    // Create the TransactionAttributeSourceAdvisor definition.
                    //创建TransactionAttributeSourceAdvisor的bean
                    RootBeanDefinition advisorDef = new RootBeanDefinition(BeanFactoryTransactionAttributeSourceAdvisor.class);
                    advisorDef.setSource(eleSource);
                    advisorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                    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);
                }
            }
        }
    
    

    一步步往下走,在configureAutoProxyCreator方法中我们目前只关注registerAutoProxyCreatorIfNecessary方法

        public static void registerAutoProxyCreatorIfNecessary(
                ParserContext parserContext, Element sourceElement) {
    
            BeanDefinition beanDefinition = AopConfigUtils.registerAutoProxyCreatorIfNecessary(
                    parserContext.getRegistry(), parserContext.extractSource(sourceElement));
            useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
            registerComponentIfNecessary(beanDefinition, parserContext);
        }
    

    然后在AopConfigUtils.registerAutoProxyCreatorIfNecessary方法中

        @Nullable
        public static BeanDefinition registerAutoProxyCreatorIfNecessary(
                BeanDefinitionRegistry registry, @Nullable Object source) {
    
            return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
        }
    

    那么在registerAutoProxyCreatorIfNecessary方法中,我们能看到的是注册了一个InfrastructureAdvisorAutoProxyCreator类型的bean而已,那么属于事务关键流程的又是哪一步呢?
    其实上面这一串代码流程走下来,主要往正常的bean注册的流程靠近,InfrastructureAdvisorAutoProxyCreator类继承了AbstractAdvisorAutoProxyCreator类,而AbstractAdvisorAutoProxyCreator类又继承了AbstractAutoProxyCreator类,而AbstractAutoProxyCreator类就是bean实例化的重要类,其中的postProcessAfterInitialization方法才是接下来流程的关键

       @Override
       public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
           if (bean != null) {
               // 根据给定的 bean的class和name 构建一个 key
               Object cacheKey = getCacheKey(bean.getClass(), beanName);
               if (this.earlyProxyReferences.remove(cacheKey) != bean) {
                   // 如果它适合被代理 则要封装指定 bean
                   return wrapIfNecessary(bean, beanName, cacheKey);
               }
           }
           return bean;
       }
    

    相关文章

      网友评论

          本文标题:Spring中@Transactional注解到底做了什么(二)

          本文链接:https://www.haomeiwen.com/subject/fewmvhtx.html