说在前面
本文转自“天河聊技术”微信公众号
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)); } }
说到最后
本次解析仅代表个人见解,仅供参考。