SpringBoot源码 - 自动配置原理
- 打开主程序的代码,如下:
@SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
可以看到主程序很简单,只有一个注解 @SpringBootApplication,这就是springboot启动的核心
- 点击 @SpringBootApplication 进去,可以发现它是一个组合注解,包括两个核心注解:
@SpringBootConfiguration @EnableAutoConfiguration public @interface SpringBootApplication {……}
- 点击@SpringBootConfiguration 进去,可以看到它只有一个注解@Configuration:
@Configuration public @interface SpringBootConfiguration {……}
@Configuration 代表着这是一个 Spring 配置类,可以认为 @SpringBootConfiguration = @Configuration
- 再点击另一个注解 @EnableAutoConfiguration进去看,可以看到包含两个注解
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {……}
点击 @AutoConfigurationPackage 进去,可以看到:
@Import({Registrar.class}) public @interface AutoConfigurationPackage {……}
再点 Registrar 进去,看到这个方法:
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(newAutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
默认情况下,就是将主配置类(@SpringBootApplication)所在的包以及子包里的组件扫描到容器中。
回到EnableAutoConfiguration,点击 AutoConfigurationImportSelector 进去,可以看到有个 getCandidateConfigurations()方法,可以通过里面的loadFactoryNames()获取所有配置:
List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
再点开 SpringFactoriesLoader.loadFactoryNames()方法,可以看到:
文章图片
而在 SpringFactoriesLoader.loadFactoryNames() 方法参数中点开 getSpringFactoriesLoaderFactoryClass(),返回的是EnableAutoConfiguration.class:
protected Class> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
【SpringBoot源码 - 自动配置原理】也就是导入资源类,在 META-INF/spring.factories 中找,把key为 EnableAutoConfiguration 的资源加载进来:
文章图片
但是,spring.factories中这么多配置,并不会在启动的时候全部加装,打开RedisAutoConfiguration ,可以看到:
文章图片
所以是通过 @ConditionalOnClass 注解判断是否加装该配置
自动配置加载过程如下:
文章图片
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- python学习之|python学习之 实现QQ自动发送消息
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 使用composer自动加载类文件
- 人脸识别|【人脸识别系列】| 实现自动化妆
- Android事件传递源码分析
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- ffmpeg源码分析01(结构体)