自动配置原理
SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
@SpringBootApplication-->@SpringBootConfiguration/@EnableAutoConfiguration--->
- Spring内部会把家里@SpringBootConfiguration注解的类,定义为根配置类
- EnableAutoConfiguration
@AutoConfigurationPackage 确定自动加载扫描包的路径
@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector 这个类实现了这个接口DeferredImportSelector,然后这个接口又继承了这个ImportSelector接口,即
AutoConfigurationImportSelector implements DeferredImportSelector extends ImportSelector
ImportSelector这个接口有一个selectImports方法,其返回是的String数组,里面的内容必须是一些类的路径名称。比如说org.springframework.boot.autoconfigure.**。
Spring 会把这个数组返回出来的类路径名全部加载并且把他们注入到Spring IOC容器当中。
String[] selectImports(AnnotationMetadata importingClassMetadata);
- AutoConfigurationImportSelector类重写了selectImports这个方法,
- selectImports方法调用方法getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata); - getAutoConfigurationEntry()调用getCandidateConfigurations()方法,此方法是重点。
- getCandidateConfigurations()方法中,使用SpringFactoriesLoader类下的loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)方法,其中有两个参数,第一个参数指的是需要加载的类的类型,这里做了进一步指定,实则是META-INF/spring.facatories文件下的org.springframework.boot.autoconfigure.EnableAutoConfiguration,下面有131个类路径。第二个参数是ClassLoader类加载。这个loadSpringFactories()返回loadSpringFactories()方法,进一步进入loadSpringFactories()方法,可以看到获取FACTORIES_RESOURCE_LOCATION属性,而
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
此配置文件"META-INF/spring.factories"即是要默认自动装载的所有的类路径文件,这里自动配置的是org.springframework.boot.autoconfigure.EnableAutoConfiguration。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}