疑问: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...