@EnableTransactionManagement

161 阅读1分钟

@EnableTransactionManagement分析

本文主要说明怎么从@EnableTransactionManagement到AutoProxyRegistrar#registerBeanDefinitions的调用过程,从而注册我们的BeanDefinition [即添加到beanDefinitionMap]

断点打到 org.springframework.transaction.annotation.TransactionManagementConfigurationSelector#selectImports,观察其堆栈 image-20220526144318291.png

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);
       }
    }
…………
​

配置类,递归调用

image-20220526143853702.png

断点打到org.springframework.context.annotation.ConfigurationClass#addImportBeanDefinitionRegistrar

image-20220526142121732.png 往importBeanDefinitionRegistrars 这个Map存了一个实体;key为AutoProxyRegistrar的实例,value为StandardAnnotationMetadata实例;

断点打到org.springframework.context.annotation.AutoProxyRegistrar#registerBeanDefinitions

image-20220526145034232.png

发现其调用堆栈从 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?

InfrastructureAdvisorAutoProxyCreator.PNG AnnotationAwareAspectJAutoProxyCreator

解析切面

把实现了Advisor接口的类实例化

org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper#findAdvisorBeans

image-20220527110724434.png

创建动态代理

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization

每个类getBean的时候都会被调用,判断当前Bean是否切中表达式,这里是带有@Transactional的;

image-20220527112543762.png 另外一种责任链的调用方式

image-20220527143714636.png

org.springframework.transaction.interceptor.TransactionInterceptor#invoke

image-20220527144604217.png

org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction

image-20220527144948699.png

image-20220527145205034.png

下一篇org.springframework.transaction.interceptor.TransactionAspectSupport#createTransactionIfNecessary [事务传播行为的逻辑]