Skip to content

启动流程

Spring Boot 的启动流程是一个复杂但高度优化的过程,旨在快速启动并运行一个 Spring 应用程序。以下是简化后的启动流程概述:

1. 解析命令行参数

  • 当使用 java -jar 或者通过 IDE 运行时,Spring Boot 解析传递给应用程序的命令行参数。

2. 创建 SpringApplication 实例

  • 启动类(通常标记有 @SpringBootApplication 注解)会创建一个 SpringApplication 实例。这个实例负责引导整个应用的启动过程。
  • 如果存在自定义的 SpringApplication 配置,如监听器或运行器,则在此阶段进行设置。

3. 准备环境配置

  • 加载默认和用户提供的配置文件(如 application.propertiesapplication.yml),包括根据激活的 profile 加载特定配置文件。
  • 处理环境变量、系统属性以及命令行参数等外部配置源。

4. 初始化上下文

  • 创建 ApplicationContext 实例(通常是 AnnotationConfigServletWebServerApplicationContext 对于 Web 应用,或者 AnnotationConfigApplicationContext 对于非 Web 应用)。
  • 设置上下文的环境,并注册基本的 Bean 定义,例如 PropertySourcesPlaceholderConfigurerEnvironment

5. 加载自动配置类

  • 通过 spring.factories 文件中的 EnableAutoConfiguration 来加载一系列的自动配置类。这些类基于类路径上的依赖来提供合理的默认配置。
  • 自动配置是 Spring Boot 的核心特性之一,它能够根据你项目中的依赖关系自动配置很多常见的功能,而不需要显式地编写大量的配置代码。

6. 处理条件注解

  • 在加载自动配置类的过程中,Spring Boot 使用条件化逻辑(例如 @ConditionalOnClass, @ConditionalOnMissingBean 等)来决定哪些 Bean 应该被创建。这确保了只有当满足某些条件时才会创建特定的 Bean。

7. 发布事件

  • 在不同的启动阶段,SpringApplication 会发布一系列的应用事件(如 ApplicationStartingEvent, ApplicationEnvironmentPreparedEvent, ApplicationPreparedEvent, ApplicationStartedEvent, ApplicationReadyEvent)。开发者可以监听这些事件来进行定制化的操作。

8. 启动嵌入式容器(针对 Web 应用)

  • 如果是 Web 应用,Spring Boot 会尝试启动嵌入式的 Servlet 容器(如 Tomcat, Jetty 或 Undertow)。这个步骤会根据配置来绑定端口、设置上下文路径等。

9. 刷新上下文

  • 上下文被刷新,所有剩余的单例 Beans 被实例化,包括那些由开发者定义的 Beans 和自动配置添加的 Beans。
  • 初始化完成后,所有的生命周期回调(如 InitializingBean, DisposableBean, @PostConstruct, @PreDestroy)都会被执行。

10. 执行 ApplicationRunnerCommandLineRunner 接口实现

  • 如果有任何实现了 ApplicationRunnerCommandLineRunner 接口的 Bean,它们将在上下文完全初始化后被执行。这是在应用程序启动完成之后执行一些自定义逻辑的好地方。

11. 完成启动

  • 发布 ApplicationReadyEvent 事件,表示应用程序已经准备好处理请求。
  • 如果没有异常发生,控制台会输出类似 Started Application in X.X seconds 的消息,表明应用程序成功启动。

12. 等待终止信号

  • 应用程序将保持运行状态,等待来自外部的停止信号(如键盘中断、系统关闭等)。

这个流程保证了 Spring Boot 应用能够以最小的配置快速启动,并且提供了灵活的方式来定制各个阶段的行为。