注:该文章作为笔记向,偶尔翻出来看看,以后学的更多会继续更改,若有问题,请指出
@SpringBootApplication
标注在某个类上,说明是主配置类
点进去后,还有三个注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ComponentScan
扫描包下的类
@SpringBootConfiguration
@Configuration
@Component
这里说明了主配置类就是spring里的一个组件
@EnableAutoConfiguration
开启自动配置,springboot帮我们自动配置
点进去又可以看见两个注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
自动配置包
点进去又有一个注解
@Import(AutoConfigurationPackages.Registrar.class)
//@Import:给容器中导入一个组件
/*
AutoConfigurationPackages.Registrar.class
自动配置包注册器的类
将主启动类的所在包及包下面所有子包的所有组件扫描到Spring
*/
@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector.class:自动配置导入选择器,会选择性的自动导入组件
点进AutoConfigurationImportSelector这个类
其中有这样一个方法
//获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
//getSpringFactoriesLoaderFactoryClass()方法返回了EnableAutoConfiguration注解类
//这里就是说要导入的组件是在主配置类(EnableAutoConfiguration标识的)下所用到的
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;
}
SpringFactoriesLoader.loadFactoryNames方法
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
ClassLoader classLoaderToUse = classLoader;
if (classLoader == null) {
classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
}
String factoryTypeName = factoryType.getName();
//这个函数又去调用了loadSpringFactories
return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}
再看loadSpringFactories方法,发现里面有说到一个META-INF/spring.factories
META-INF/spring.factories
这个文件就是自动配置的根源,他里面写了很多自动的配置文件(此处可以找到其位置)
我们随便点开其中的一个自动配置类
都是先判断是否满足条件,再作为配置类导入容器(configuration注解)
结论
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值