@EnableTransactionManagement分析
本文主要说明怎么从@EnableTransactionManagement到AutoProxyRegistrar#registerBeanDefinitions的调用过程,从而注册我们的BeanDefinition [即添加到beanDefinitionMap]
断点打到 org.springframework.transaction.annotation.TransactionManagementConfigurationSelector#selectImports,观察其堆栈
org.springframework.context.annotation.ConfigurationClassParser#processImports
…………省略
if (candidate.isAssignable(ImportSelector.class)) {
// Candidate class is an ImportSelector -> delegate to it to determine imports
Class<?> candidateClass = candidate.loadClass();
ImportSelector selector = ParserStrategyUtils.instantiateClass(candidateClass, ImportSelector.class,
this.environment, this.resourceLoader, this.registry);
Predicate<String> selectorFilter = selector.getExclusionFilter();
if (selectorFilter != null) {
exclusionFilter = exclusionFilter.or(selectorFilter);
}
if (selector instanceof DeferredImportSelector) {
this.deferredImportSelectorHandler.handle(configClass, (DeferredImportSelector) selector);
}
else {
String[] importClassNames = selector.selectImports(currentSourceClass.getMetadata());
Collection<SourceClass> importSourceClasses = asSourceClasses(importClassNames, exclusionFilter);
processImports(configClass, currentSourceClass, importSourceClasses, exclusionFilter, false);
}
}
…………
配置类,递归调用
断点打到org.springframework.context.annotation.ConfigurationClass#addImportBeanDefinitionRegistrar
往importBeanDefinitionRegistrars 这个Map存了一个实体;key为AutoProxyRegistrar的实例,value为StandardAnnotationMetadata实例;
断点打到org.springframework.context.annotation.AutoProxyRegistrar#registerBeanDefinitions
发现其调用堆栈从 org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions 开始;
调到this.reader.loadBeanDefinitions(configClasses); 后面执行遍历把我们的执行到AutoProxyRegistrar#registerBeanDefinitions这个方法的;
总结一下其调用堆栈
1.ConfigurationClassPostProcessor#processConfigBeanDefinitions
2.递归调用ConfigurationClassParser#processImports ,往importBeanDefinitionRegistrars 这个Map存了一个实体;key为AutoProxyRegistrar的实例
3.this.reader.loadBeanDefinitions(configClasses)
4.AutoProxyRegistrar#registerBeanDefinitions ,添加BeanDefinition
添加了什么beanDefinition?
AnnotationAwareAspectJAutoProxyCreator
解析切面
把实现了Advisor接口的类实例化
org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans
创建动态代理
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
每个类getBean的时候都会被调用,判断当前Bean是否切中表达式,这里是带有@Transactional的;
另外一种责任链的调用方式
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction
下一篇org.springframework.transaction.interceptor.TransactionAspectSupport#createTransactionIfNecessary [事务传播行为的逻辑]