Spring源码分析【4】-Spring扫描basePackages注解

org.springframework.beans.factory.support.DefaultListableBeanFactory

重要数据结构

/** Map of bean definition objects, keyed by bean name */
	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

RootConfig 代码

@Configuration
@Import(MybatisConfig.class)
@ComponentScan(basePackages = {"com.xxx.*"},
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}

org.springframework.context.annotation.
ComponentScanAnnotationParser.parse

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.resolveBasePackage

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.util.ClassUtils.convertClassNameToResourcePath

《Spring源码分析【4】-Spring扫描basePackages注解》

getResources

《Spring源码分析【4】-Spring扫描basePackages注解》

getResources

《Spring源码分析【4】-Spring扫描basePackages注解》

findPathMatchingResources

《Spring源码分析【4】-Spring扫描basePackages注解》

determineRootDir

《Spring源码分析【4】-Spring扫描basePackages注解》

回到findPathMatchingResources

《Spring源码分析【4】-Spring扫描basePackages注解》

findPathMatchingResources的result

《Spring源码分析【4】-Spring扫描basePackages注解》

一直退回到findCandidateComponents

《Spring源码分析【4】-Spring扫描basePackages注解》

MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);

《Spring源码分析【4】-Spring扫描basePackages注解》

MetadataReader

《Spring源码分析【4】-Spring扫描basePackages注解》

if (isCandidateComponent(metadataReader))

《Spring源码分析【4】-Spring扫描basePackages注解》

ScannedGenericBeanDefinition

《Spring源码分析【4】-Spring扫描basePackages注解》

回到findCandidateComponents

《Spring源码分析【4】-Spring扫描basePackages注解》

return candidates;

《Spring源码分析【4】-Spring扫描basePackages注解》

返回doScan

《Spring源码分析【4】-Spring扫描basePackages注解》

checkCandidate

《Spring源码分析【4】-Spring扫描basePackages注解》

回doScan

《Spring源码分析【4】-Spring扫描basePackages注解》

BeanDefinitionHolder

《Spring源码分析【4】-Spring扫描basePackages注解》

beanDefinitions.add(definitionHolder);

《Spring源码分析【4】-Spring扫描basePackages注解》

registerBeanDefinition

《Spring源码分析【4】-Spring扫描basePackages注解》

registerBeanDefinition

《Spring源码分析【4】-Spring扫描basePackages注解》

oldBeanDefinition = this.beanDefinitionMap.get(beanName);

《Spring源码分析【4】-Spring扫描basePackages注解》

if (hasBeanCreationStarted()) 

《Spring源码分析【4】-Spring扫描basePackages注解》

this.beanDefinitionMap.put(beanName, beanDefinition);

《Spring源码分析【4】-Spring扫描basePackages注解》

updatedDefinitions

《Spring源码分析【4】-Spring扫描basePackages注解》

doScan return beanDefinitions;

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ComponentScanAnnotationParser.parse

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass

《Spring源码分析【4】-Spring扫描basePackages注解》

《Spring源码分析【4】-Spring扫描basePackages注解》

parse

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass

《Spring源码分析【4】-Spring扫描basePackages注解》

this.configurationClasses.put(configClass, configClass);

《Spring源码分析【4】-Spring扫描basePackages注解》

回到doProcessConfigurationClass

《Spring源码分析【4】-Spring扫描basePackages注解》

for (SourceClass ifc : sourceClass.getInterfaces()) {

《Spring源码分析【4】-Spring扫描basePackages注解》

doProcessConfigurationClass

// No superclass -> processing is complete

return null;

《Spring源码分析【4】-Spring扫描basePackages注解》

processConfigurationClass

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ConfigurationClassParser.parse

《Spring源码分析【4】-Spring扫描basePackages注解》

parse

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions

《Spring源码分析【4】-Spring扫描basePackages注解》

alreadyParsed.addAll(configClasses);

《Spring源码分析【4】-Spring扫描basePackages注解》

alreadyParsedClasses

《Spring源码分析【4】-Spring扫描basePackages注解》

《Spring源码分析【4】-Spring扫描basePackages注解》

invokeBeanDefinitionRegistryPostProcessors

《Spring源码分析【4】-Spring扫描basePackages注解》

org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

《Spring源码分析【4】-Spring扫描basePackages注解》

// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
			invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

《Spring源码分析【4】-Spring扫描basePackages注解》

postProcessorNames

《Spring源码分析【4】-Spring扫描basePackages注解》

refresh

《Spring源码分析【4】-Spring扫描basePackages注解》

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/unix21/article/details/52163789
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞