主题
启动流程
Spring Boot 的启动流程是一个复杂但高度优化的过程,旨在快速启动并运行一个 Spring 应用程序。以下是简化后的启动流程概述:
1. 解析命令行参数
- 当使用
java -jar
或者通过 IDE 运行时,Spring Boot 解析传递给应用程序的命令行参数。
2. 创建 SpringApplication
实例
- 启动类(通常标记有
@SpringBootApplication
注解)会创建一个SpringApplication
实例。这个实例负责引导整个应用的启动过程。 - 如果存在自定义的
SpringApplication
配置,如监听器或运行器,则在此阶段进行设置。
3. 准备环境配置
- 加载默认和用户提供的配置文件(如
application.properties
或application.yml
),包括根据激活的 profile 加载特定配置文件。 - 处理环境变量、系统属性以及命令行参数等外部配置源。
4. 初始化上下文
- 创建
ApplicationContext
实例(通常是AnnotationConfigServletWebServerApplicationContext
对于 Web 应用,或者AnnotationConfigApplicationContext
对于非 Web 应用)。 - 设置上下文的环境,并注册基本的 Bean 定义,例如
PropertySourcesPlaceholderConfigurer
和Environment
。
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. 执行 ApplicationRunner
或 CommandLineRunner
接口实现
- 如果有任何实现了
ApplicationRunner
或CommandLineRunner
接口的 Bean,它们将在上下文完全初始化后被执行。这是在应用程序启动完成之后执行一些自定义逻辑的好地方。
11. 完成启动
- 发布
ApplicationReadyEvent
事件,表示应用程序已经准备好处理请求。 - 如果没有异常发生,控制台会输出类似
Started Application in X.X seconds
的消息,表明应用程序成功启动。
12. 等待终止信号
- 应用程序将保持运行状态,等待来自外部的停止信号(如键盘中断、系统关闭等)。
这个流程保证了 Spring Boot 应用能够以最小的配置快速启动,并且提供了灵活的方式来定制各个阶段的行为。