Spring Boot 的启动流程主要由 SpringApplication
类来驱动,它封装了 Spring 应用程序的初始化和运行逻辑。下面是对 SpringApplication
启动流程的一个概要分析:
1. 创建 SpringApplication 实例
启动流程通常从创建一个 SpringApplication
实例开始。你可以通过传递主配置类(如 MyApplication.class
)或者一个包含多个配置类的数组给构造函数来创建它。此外,还可以提供一个可选的 ApplicationContextInitializer
和 ApplicationListener
列表来定制上下文的初始化过程和监听应用事件。
2. 初始化 ApplicationArguments
SpringApplication
会初始化 ApplicationArguments
对象,该对象提供了对命令行参数和非选项参数(即非 --key=value
格式的参数)的访问。
3. RunListeners 聚集
Spring Boot 收集所有注册的 RunListener
,这些监听器用于监听应用程序启动和关闭过程中的关键事件。
4. Banner 初始化
接下来,SpringApplication
初始化 Banner
,这是在应用程序启动时打印到控制台的一段可定制信息。默认情况下,Spring Boot 使用了一个包含版本信息的ASCII艺术横幅,但你可以自定义它或完全禁用它。
5. 应用上下文的准备
这一阶段包括以下步骤:
- 环境准备:根据需要创建或调整
Environment
,这可能包括加载默认属性、激活profiles等。 - 应用上下文初始化:决定使用哪种类型的
ApplicationContext
(通常是AnnotationConfigApplicationContext
),并配置其设置。 - 配置源的加载:加载配置文件(如 application.properties 或者 YAML 文件)、命令行参数和其他外部配置源。
- 初始化 Bean 定义:扫描并注册 @Component, @Service, @Repository, @Controller 等注解标记的类作为 Spring Beans。
6. 应用事件发布
在不同的启动阶段,SpringApplication
会发布各种 ApplicationEvent
,允许 ApplicationListener
监听并响应这些事件,比如 ApplicationStartingEvent
, ApplicationEnvironmentPreparedEvent
, ContextRefreshedEvent
等。
7. 调用 Runners
一旦上下文准备完毕,Spring Boot 会查找实现了 CommandLineRunner
或 ApplicationRunner
接口的 Bean,并调用它们的 run
方法。这是执行启动后任务的常见方式。
8. 自动配置与启动Web服务器(如果适用)
对于Web应用,Spring Boot 会自动配置嵌入式Web服务器(如Tomcat、Jetty或Undertow),并启动它。这个过程基于 Spring-web
模块和 spring-boot-starter-web
的自动配置逻辑。
9. 应用运行
至此,Spring Boot 应用已经完全启动并准备好处理请求(对于Web应用而言)。
10. 关闭钩子
Spring Boot 注册了一个 JVM 关闭钩子,确保当应用接收到终止信号时能优雅地关闭,包括调用 DisposableBean
接口的 destroy
方法和 @PreDestroy
注解的方法。
整个启动流程体现了 Spring Boot 的“约定优于配置”原则,旨在简化Spring应用的搭建和运行过程。