spring事务管理源码解析之namespaceHandler

独自空忆成欢 提交于 2019-11-29 05:26:43

说在前面

本文转自“天河聊技术”微信公众号

spring事务管理项目开发中都会用到,大家一般用的都是声明式事务管理,spring也集成jta全局事务管理的支持,用的比较少,本次主要针对声明式本地事务管理角度进行源码解析,有好的见解欢迎关注“天河聊技术”微信公众号,在微信公众号中找到我本人微信加入技术微信群进一步交流,你们的支持是我一直写下去的动力,如果觉得看完对自己有所帮助,也欢迎朋友圈转发,源码解析很痛苦,it生涯就是这样,这种痛苦也叫成长。

 

正文

事务管理器

本地事务基于jdbc的是org.springframework.jdbc.datasource.DataSourceTransactionManager

 

事务注解解析器

使用spring的事务管理,要先引入spring-tx包,那就先会加载org.springframework.transaction.config.TxNamespaceHandler,先简单看下这个类的内容

registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());

这行代码是对<tx:annotation-driven"/>标签的解析。

 

进入到这个类的这个方法

org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser#parse

public BeanDefinition parse(Element element, ParserContext parserContext) {  //    注册事务监听器工厂        registerTransactionalEventListenerFactory(parserContext);  //    获取模式属性        String mode = element.getAttribute("mode");        if ("aspectj".equals(mode)) {           // mode="aspectj"           registerTransactionAspect(element, parserContext);        }        else {           // mode="proxy"           AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext);        }        return null;     }
private void registerTransactionalEventListenerFactory(ParserContext parserContext) {  //    注册事务监听器的bean定义        RootBeanDefinition def = new RootBeanDefinition();        def.setBeanClass(TransactionalEventListenerFactory.class);        parserContext.registerBeanComponent(new BeanComponentDefinition(def,              TransactionManagementConfigUtils.TRANSACTIONAL_EVENT_LISTENER_FACTORY_BEAN_NAME));     }

这个标签可以指定事务实现模式,mode属性,值是aspectj和proxy两种,默认是后者。

 

创建自动代理器

AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext);

 

进入这个方法

org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer#configureAutoProxyCreator

public static void configureAutoProxyCreator(Element element, ParserContext parserContext) {  //       注册自动代理器           AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);    //       解析internalTransactionAdvisor beanName           String txAdvisorBeanName = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME;           if (!parserContext.getRegistry().containsBeanDefinition(txAdvisorBeanName)) {              Object eleSource = parserContext.extractSource(element);                // Create the TransactionAttributeSource definition.              RootBeanDefinition sourceDef = new RootBeanDefinition(                    "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource");              sourceDef.setSource(eleSource);              sourceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  //          注册事务属性对象并返回自动生成的beanName              String sourceName = parserContext.getReaderContext().registerWithGeneratedName(sourceDef);                // Create the TransactionInterceptor definition.              RootBeanDefinition interceptorDef = new RootBeanDefinition(TransactionInterceptor.class);              interceptorDef.setSource(eleSource);              interceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  //          注册事务管理器到事务拦截器bean定义中              registerTransactionManager(element, interceptorDef);  //          注册事务属性资源到事务拦截器bean定义中              interceptorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));  //          注册事务拦截器bean定义并返回自动生成的beanName              String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef);                // Create the TransactionAttributeSourceAdvisor definition.创建事务属性资源通知bean定义              RootBeanDefinition advisorDef = new RootBeanDefinition(BeanFactoryTransactionAttributeSourceAdvisor.class);              advisorDef.setSource(eleSource);              advisorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  //          把事务属性资源引用注册到TransactionAttributeSourceAdvisor bean定义中              advisorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));  //          添加通知beanName到TransactionAttributeSourceAdvisor bean定义中              advisorDef.getPropertyValues().add("adviceBeanName", interceptorName);              if (element.hasAttribute("order")) {                 advisorDef.getPropertyValues().add("order", element.getAttribute("order"));              }  //          注册TransactionAttributeSourceAdvisor bean定义              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);           }        }     }
注册自动代理器           AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
public static void registerAutoProxyCreatorIfNecessary(           ParserContext parserContext, Element sourceElement) {          BeanDefinition beanDefinition = AopConfigUtils.registerAutoProxyCreatorIfNecessary(              parserContext.getRegistry(), parserContext.extractSource(sourceElement));  //    如果需要采用cglib自动代理        useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);        registerComponentIfNecessary(beanDefinition, parserContext);     }

 

返回到这个方法

org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser#parse

 

注册事务切面

// mode="aspectj"  registerTransactionAspect(element, parserContext);
private void registerTransactionAspect(Element element, ParserContext parserContext) {        String txAspectBeanName = TransactionManagementConfigUtils.TRANSACTION_ASPECT_BEAN_NAME;        String txAspectClassName = TransactionManagementConfigUtils.TRANSACTION_ASPECT_CLASS_NAME;        if (!parserContext.getRegistry().containsBeanDefinition(txAspectBeanName)) {           RootBeanDefinition def = new RootBeanDefinition();           def.setBeanClassName(txAspectClassName);           def.setFactoryMethodName("aspectOf");  //       注册事务管理器到bean定义中           registerTransactionManager(element, def);  //       注册事务管理器切面bean定义           parserContext.registerBeanComponent(new BeanComponentDefinition(def, txAspectBeanName));        }     }

说到最后

本次解析仅代表个人见解,仅供参考。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!