Insight tx:annotation-driven 解析

疑问:tx:annotation-driven 解析做了哪些工作,@Transactional 解析是那个阶段?

...

需要准备的知识:Insight spring 常识 |  Insight spring advisor 初始化

...

1、tx:annotation-driven 解析。

按照以往的分析,tx:xxx配置的解析由TxNamespaceHandler 完成。然后找到annotation-driven的解析器:AnnotationDrivenBeanDefinitionParser。

关键的部分:parse过程动态创建advisor (其中pointcut.matcher = AnnotationTransactionAttributeSource , 其中advice = TransactionInterceptor)。 advisor = BeanFactoryTransactionAttributeSourceAdvisor

下面列出简明源码:

/**
 * Parses the 
   
    tag.
 */
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
    
    private static class AopAutoProxyConfigurer {
    
        public static void configureAutoProxyCreator(Element element, ParserContext parserContext) {
            // 解析proxy-target-class,是否采用CGLIB proxy
            AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
            
            if (!parserContext.getRegistry().containsBeanDefinition(txAdvisorBeanName)) {
            	// Create the TransactionAttributeSource definition.
            	RootBeanDefinition sourceDef = new RootBeanDefinition("org.springframework.transaction.annotation.AnnotationTransactionAttributeSource");
            	String sourceName = parserContext.getReaderContext().registerWithGeneratedName(sourceDef);
            
            	// Create the TransactionInterceptor definition.
            	RootBeanDefinition interceptorDef = new RootBeanDefinition(TransactionInterceptor.class);
            	// 配置 interceptor.transactionManagerBeanName
            	registerTransactionManager(element, interceptorDef);
            	interceptorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));
            	String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef);
            
            	// core! Create the TransactionAttributeSourceAdvisor definition.
            	RootBeanDefinition advisorDef = new RootBeanDefinition(BeanFactoryTransactionAttributeSourceAdvisor.class);
            	advisorDef.getPropertyValues().add("transactionAttributeSource", new RuntimeBeanReference(sourceName));
            	advisorDef.getPropertyValues().add("adviceBeanName", interceptorName);
            	parserContext.getRegistry().registerBeanDefinition(txAdvisorBeanName, advisorDef);
            }
        }
    }
}
...

2、@Transactional 解析分为初始化解析(注解类解析)、应用解析(属性解析)。

参考之前Insight 根据advisor生成Proxy过程的分析,我们知道事务控制的代理就是在此时生成。

确定哪些类生成事务代理,就是根据是否上述1中pointcut确定,pointcut match逻辑实现依赖AnnotationTransactionAttributeSource 判断bean中是否含有Transactional  注解。

Transactional  的解析策略是靠AnnotationTransactionAttributeSource初始化默认注册的SpringTransactionAnnotationParser完成。

...

总结:tx:annotation-driven 解析--创建并注册事务advisor;

@Transactional 决定哪些类产生事务proxy。


@Transactional 的属性是什么时候解析并产生了哪些作用?

to be continued...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值