SpringBoot是如何启动的?
本文是通过查看SpringBoot源码整理出来的SpringBoot大致启动流程,整体大方向是以简单为出发点,不说太多复杂的东西,内部实现细节本文不深扣因为每个人的思路、理解都不一样,我个人看的理解跟大家看的肯定不一样,到时候表达的出来的云里雾里也没啥用。
首先我将SpringBoot的启动流程整理成以下阶段:
- SpringApplicaiton初始化
- 审查ApplicationContext类型
- 加载ApplicationContextInitializer
- 加载ApplicationListener
- Environment初始化
- 解析命令行参数
- 创建Environment
- 配置Environment
- 配置SpringApplication
- ApplicationContext初始化
- 创建ApplicationContext
- 设置ApplicationContext
- 刷新ApplicationContext
- 运行程序入口
省去了一些不影响主流程的细节,在查看SpringBoot源码之前,不得不提一下spring.factories
这个文件的使用和功能。
关于spring.factories
spring.factories
是一个properties文件,它位于classpath:/META-INF/
目录里面,每个jar包都可以有spring.factories
的文件。Spring提供工具类SpringFactoriesLoader
负责加载、解析文件,如spring-boot-2.2.0.RELEASE.jar
里面的META-INF
目录里面就有spring.factories
文件:
# PropertySource Loaders org.springframework.boot.env.PropertySourceLoader=\ org.springframework.boot.env.PropertiesPropertySourceLoader,\ org.springframework.boot.env.YamlPropertySourceLoader # Run Listeners org.springframework.boot.SpringApplicationRunListener=\ org.springframework.boot.context.event.EventPublishingRunListener ...
关于spring.factories
需要知道些什么?
spring.factories
是一个properties文件spring.factories
里的键值对的value是以逗号分隔的完整类名列表
spring.factories
里的键值对的key是完整接口名称
spring.factories
键值对的value是key的实现类spring.factories
是由SpringFactoriesLoader
工具类加载spring.factories
位于classpath:/META-INF/
目录SpringFactoriesLoader
会加载jar包里面的spring.factories
文件并进行合并
知道spring.factories
的概念后,继续来分析SpringBoot的启动。
SpringApplicaiton初始化
Java程序的入口在main<