Spring Boot 启动原理(SpringApplication.run(...) 流程)
一、Spring Boot 启动原理(SpringApplication.run(...)
流程)
-
创建 SpringApplication 实例
-
SpringApplication.run(…)
首先根据传入的主启动类(带有@SpringBootApplication
注解的类)构造一个SpringApplication
对象。 -
在构造过程中,会收集环境(
Environment
)、监听器(ApplicationListener
)、初始器(ApplicationContextInitializer
)等。
-
-
准备环境(Environment)
-
通过
ConfigFileApplicationListener
加载配置文件(application.properties
/application.yml
),并把它们解析进Environment
。 -
支持多种配置源(命令行参数、系统环境变量、配置文件、
Spring Cloud
配置中心等),并按照优先级合并。
-
-
发布事件:
ApplicationStartingEvent
-
在真正创建
ApplicationContext
之前,先发布一个“启动开始”事件,供用户或框架中其他组件监听。
-
-
创建并配置
ApplicationContext
-
根据应用类型(Web 应用:
AnnotationConfigServletWebServerApplicationContext
;非 Web:AnnotationConfigApplicationContext
),实例化对应的ApplicationContext
。 -
将
Environment
、ResourceLoader
、ApplicationArguments
等注入上下文。 -
调用所有注册的
ApplicationContextInitializer
,允许用户在上下文刷新前做手动调整。
-
-
注册 Bean 定义
-
扫描启动类及其子包下所有带注解的组件(
@Component
,@Service
,@Controller
…) -
加载自动配置:
-
利用
spring.factories
中的EnableAutoConfiguration
条目,通过AutoConfigurationImportSelector
找到所有可能的自动配置类 -
条件注解(
@ConditionalOnClass
、@ConditionalOnMissingBean
…)决定哪些自动配置会真正生效
-
-
-
刷新(
context.refresh()
)-
完整地解析并实例化所有 Bean,执行 Bean 后处理器(
BeanPostProcessor
)、事件发布(ContextRefreshedEvent
)等钩子 -
如果是 Web 应用,会启动内嵌的 Servlet 容器(Tomcat/Jetty/Undertow)
-
-
运行回调
-
所有注册的
ApplicationRunner
和CommandLineRunner
会被依次调用,执行用户自定义的启动逻辑
-
-
完成启动
-
发布
ApplicationReadyEvent
,标志应用已准备就绪开始接收请求; -
Spring Boot 会保持运行,直到收到关闭信号或调用
context.close()
。
-
流程图
对比
讲的步骤 | 图中对应模块/步骤 |
---|---|
1. new SpringApplication() 构造 | 【黄色区域】“构造函数” |
2. 加载 Environment(配置文件、属性源) | “加载属性资源”→“创建配置环境” |
3. 调用各类 Initializer & Listener 注册 | “init 加载初始化器”→ “设置所有可用应用程序监听器”→getRunListeners(args) |
4. 打印 Banner | “打印 banner 图案”(step3) |
5. 创建并准备好 ApplicationContext | “上下文创建”(step6.1 根据类型创建 web/standard 上下文) |
6. 调用 prepareContext(步骤7、8、10) | “准备上下文并加载资源”(step7、step8、step10) |
7. 执行 refreshContext | “上下文刷新 refreshContext”(step9) |
8. afterRefresh & 发布事件 | “上下文后置处理 afterRefresh”→“发布应用上下文启动完成” |
9. 执行 Runner(ApplicationRunner/CommandLineRunner) | “执行 Runner 逻辑”(step13) |
简而言之:
-
黄色区域 对应我说的“准备阶段”(构造、加载配置、注册监听器/初始化器);
-
红色区域 对应“运行阶段”(打印 Banner、创建/刷新 Spring 容器、发布事件、最后执行 Runner)。