SpringBoot在启动的时候,加载主配置类,主配置类上有注解@SpringBootApplication
/**
* SpringBootApplication 来标注一个主程序类,说明这是一个springboot应用
*/
@SpringBootApplication
public class MyFirstSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstSpringbootApplication.class, args);
}
}
在注解@SpringBootApplication中,通过@EnableAutoConfiguration注解开启自动配置功能
通过@EnableAutoConfiguration源码,可以看出,导入了AutoConfigurationImportSelector,利用EnableAutoConfigurationImportSelector给容器中导入一些组件。
可以查看AutoConfigurationImportSelector.class的源码中的selectImports()方法的内容,在selectImport方法中,使用了getAutoConfigurationEntry方法。
追溯到getAutoConfigurationEntry方法中,其中使用了一个getCandidateConfigurations方法,作用是获取候选的配置。
继续追溯至getCandidateConfigurations方法,其中使用SpringFactoriesLoader.loadFactoryNames。
继续追溯至loadFactoryNames方法,目的是扫描jar包所有类路径下的META-INF/spring.factories文件,得到其url,并进行遍历,最后包装得到一个properties文件 。
从返回的properties文件中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中。
总的来说,就是将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中。
每一个像这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;其中的每一个自动配置类,都开启自动配置功能。
这时,启动了自动配置功能,才是自动配置的开始。
以org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration为例,介绍自动配置原理。
所有在配置文件中可以配置的属性,都在xxxPropertise里面封装着,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;这里是ServerProperties类,如下图。