springboot分析五 AutoConfiguration 如何把已经写好的 124个自动配置加载进来

冷暖自知 提交于 2020-11-23 17:37:47

一、在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中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!