本文是通过查看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<