发现导入选择器
@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,就有对应的启动器了
-
有了启动器,我们自动装配就会生效,然后就配置成功了!
本文深入探讨了SpringBoot的自动装配原理,从@Import注解开始,逐步解析AutoConfigurationImportSelector、loadMetadata、getCandidateConfigurations等关键方法,揭示了如何从META-INF/spring.factories文件加载自动配置类。文章指出,生效的自动配置依赖于启动器,并强调了条件判断的重要性。
1123

被折叠的 条评论
为什么被折叠?



