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