一、在springboot启动类上 有个注解 @SpringBootApplication
二、在SpringBootApplication注解里有个 @EnableAutoConfiguration
三、在EnableAutoConfiguration注解里导入了一个类 AutoConfigurationImportSelector.class
四、在 AutoConfigurationImportSelector 有个 process方法 这个方法会把符合条件的AutoConfiguration 配置类 过滤出来
五、getAutoConfigurationMetadata()
这个方法会从META-INF/spring-autoconfigure-metadata.properties 这个文件 读取所有的自动配置类所需要的元数据信息
六、AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
.getAutoConfigurationEntry(getAutoConfigurationMetadata(), annotationMetadata);
这个方法会从项目的所有 META-INF/spring.factories 配置文件中 读取 EnableAutoConfiguration 这个键所对应的所有值 默认124个
根据上面获取到的所有元数据信息 去判断 124个配置类哪些符合要求
根据原数据信息把不符合要求的从124个自动配置类中过滤掉
AutoConfiguration 配置类的加载流程
再执行SpringApplication对象的run方法时 执行 refreshContext方法
会执行 ConfigurationClassPostProcessor类的 postProcessBeanDefinitionRegistry方法
会执行 前分析的 @SpringBootApplication注解里的@EnableAutoConfiguration 注解里的@Import注解里的AutoConfigurationImportSelector类中的AutoConfigurationImportSelector#AutoConfigurationGroup#process方法 把符合条件的自动配置类过滤出来
再执行AutoConfigurationImportSelector#AutoConfigurationGroup#selectImports 对过滤出的配置类进一步处理
再对符合条件的配置类进行循环遍历处理
把符合条件的配置类放到configurationClasses 集合里
放到configurationClasses 集合里后 再执行ConfigurationClassPostProcessor#processConfigBeanDefinitions方法中的
this.reader.loadBeanDefinitions(configClasses); 把配置类封装成beanDefinition对象 放到beanDefinitionMap集合中
配置类通过registerBeanDefinitionForImportedConfigurationClass(configClass); 加载到beanDefinitionMap中
最终会调用DefaultListableBeanFactory#registerBeanDefinition方法把 beanDefinition放到beanDefinitionMap中
来源:oschina
链接:https://my.oschina.net/xiaozhou18/blog/4738929