Spring Boot 的启动流程可以分为以下几个主要步骤:
1. 初始化阶段
- 引导类加载:Spring Boot 启动类通常是用
@SpringBootApplication
注解标注的类,该注解是一个复合注解,包含了@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
。 - 启动器类:
SpringApplication.run()
方法是 Spring Boot 应用启动的入口。它会创建一个SpringApplication
对象,并调用它的run
方法。
2. 配置阶段
- SpringApplication 初始化:
SpringApplication
类进行初始化配置,包括设置 Web 应用类型、读取和解析应用配置文件(如application.properties
或application.yml
)、配置 Banner(启动标语)等。 - 启动监听器:加载并调用所有实现了
ApplicationListener
接口的监听器。此时可以在application.properties
配置文件中指定监听器。
3. 环境准备阶段
- 准备环境:
SpringApplication
准备并配置应用运行的环境,包括设置系统属性、环境变量、解析配置文件等。 - 创建并配置
Environment
:根据不同的环境(如开发环境、生产环境)加载不同的配置文件。
4. 创建并刷新应用上下文
- 创建 ApplicationContext:根据应用类型(如 Servlet Web、Reactive Web、普通应用)创建相应的
ApplicationContext
实例(如AnnotationConfigServletWebServerApplicationContext
)。 - 注册所有的 Bean:扫描包路径,按照配置和自动装配机制,注册所有的 Spring Bean。
- 自动配置:根据
@EnableAutoConfiguration
注解和相关的自动配置类,自动配置 Bean。这个过程会根据META-INF/spring.factories
文件中的配置,加载各种自动配置类。
5. 启动内嵌服务器
- 启动嵌入式 Web 服务器:如果是 Web 应用,Spring Boot 会启动一个嵌入式 Web 服务器(如 Tomcat、Jetty、Undertow)。
- 注册 Servlet 和过滤器:将所有的 Servlet、过滤器、监听器注册到 Web 服务器中。
6. 应用运行阶段
- 调用所有的
CommandLineRunner
和ApplicationRunner
:在应用上下文刷新完成后,调用所有实现了CommandLineRunner
和ApplicationRunner
接口的 Bean。 - 应用开始接受请求:此时应用已经完全启动,开始接受和处理请求。
7. 关闭应用
- 注册关闭钩子:Spring Boot 会注册一个 JVM 关闭钩子,在应用关闭时调用所有的
DisposableBean
和@PreDestroy
方法,执行清理工作。
上述流程是一个高层次的概述,实际的启动过程中包含了很多细节和复杂的内部机制,如条件装配、事件发布、上下文刷新等。Spring Boot 的设计目的是为了简化 Spring 应用的配置和启动,因此很多步骤都是自动化完成的,开发者可以专注于业务逻辑的实现。