发现导入选择器
@Import(AutoConfigurationPackages.Registrar.class)
点进AutoConfigurationPackages类
//导入初始化的一些bean
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
//metadata 元数据
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
//PackageImport 导入元数据
register(registry, new PackageImport(metadata).getPackageName());
}
@Override
public Set determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(metadata));
}
}
回到@EnableAutoConfiguration 注解
查看另一个注解 @Import(AutoConfigurationImportSelector.class) 自动配置导入选择
@Import(AutoConfigurationImportSelector.class)
点进AutoConfigurationImportSelector 看看
看到AutoConfigurationImportSelector 类中选择组件的方法
public String[] selectImports(AnnotationMetadata annotationMetadata)
选择组件:就是选择哪些我们配置的pom.xml中的东西
点进loadMetadata
来到 AutoConfigurationMetadataLoader类的方法
回到AutoConfigurationImportSelector类
-
继续分析 selectImports 方法
-
getCandidateConfigurations 获取所有的配置
List configurations = getCandidateConfigurations(annotationMetadata,
attributes);
-
核心方法
-
getCandidateConfigurations 获取候选的配置
-
loadFactoryNames 首先通过加载器加载所有的
protected List getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List 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;
}
@SpringBootApplication 注解标注了 @EnableAutoConfiguration
说明一件事
@SpringBootApplication : 标注这个类是一个SpringBoot 的应用:启动类下的所有资源被导入
继续看getCandidateConfigurations 方法
-
这个配置不为空
-
META-INF/spring.factories
-
自动配置的核心文件
查看spring.factories文件
spring.factories 文件内容
-
Initializers 初始化的
-
Application Listeners 监听的
-
Auto Configuration Import Listeners 自动选择导入的包
-
Auto Configuration Import Filters
-
Auto Configure 自动配置
-
Failure analyzers
-
Template availability providers
查看spring.factories 文件中的WebMvcAutoConfiuration
WebMvcAutoConfiuration类
WebMvcProperties 类
spring.factories 文件从哪来?
&emspl先读了配置文件,才找到配置类
继续看getCandidateConfigurations 方法
点进去
来到springFactoriesLoader类
查看loadSpringFactories方法
loadSpringFactories方法 可以看到springboot 把所有的资源都加载到配置类中
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
点击 FACTORIES_RESOURCE_LOCATION 常量
加载了spring.factories 文件的所有东西
[](()4结论:
-
SpringBoot所有的自动配置都是在启动的时候扫描并加载;
-
所有的自动配置类都在这里面 spring.factories
-
但是不一定生效,要判断条件是否成立
-
只有导入了对应的start,就有对应的启动器了
-
有了启动器,我们自动装配就会生效,然后就配置成功了!



