SpringBoot启动流程图
### Spring Boot 启动流程详解 #### 一、Spring Boot 启动流程概览 Spring Boot 的启动过程涉及多个核心组件和技术细节,其中主要包括 `SpringApplication` 的 `run` 方法执行流程、应用上下文(ApplicationContext)的创建以及 Web 容器的启动等。下面将从这些关键点入手,详细解析整个启动过程中的主要步骤。 #### 二、SpringApplication.run() 方法解析 Spring Boot 应用的启动通常是从 `SpringApplication.run()` 方法开始的。该方法接收两个参数:`Class<?> primarySources` 和 `String[] args`。 - **创建 SpringApplication 对象**: - 在 `newSpringApplication(primarySources)` 调用中,首先创建了一个 `SpringApplication` 对象。 - 接下来,传入主配置类(即启动类)以及命令行参数至 `SpringApplication` 对象中。 - 主配置类被保存在 `SpringApplication` 对象内部。 - 计算当前的运行环境(如 Web 或非 Web 环境),并保存在 `SpringApplication` 对象中。 - **初始化监听器与初始化器**: - 从类路径下的 `META-INF/spring.factories` 文件中读取 `ApplicationContextInitializer` 和 `ApplicationListener` 并保存起来。 - 通过 `deduceMainApplicationClass()` 方法确定主配置类。 #### 三、SpringApplicationRunListener 监听器的使用 - 在 `run` 方法中,会从类路径下的 `META-INF/spring.factories` 文件中查询 `SpringApplicationRunListener` 类的实现,并实例化。 - 遍历所有的 `SpringApplicationRunListener` 实例,依次调用其 `starting` 方法,这一步主要用于记录日志等操作。 #### 四、环境配置 - **环境准备**:调用 `prepareEnvironment(listeners, applicationArguments)` 方法,用于创建或获取一个 `ConfigurableEnvironment` 对象。 - **环境绑定**:将命令行参数等信息配置到环境中,并将环境对象绑定到 `SpringApplication` 对象上。 - **环境预准备**:调用 `SpringApplicationRunListener.environmentPrepared` 方法,进行环境预准备的相关操作。 #### 五、创建 ApplicationContext - 根据当前环境类型决定创建 Web 容器还是普通 IOC 容器。 - 创建完成后,通过 `context.setEnvironment(environment)` 设置环境信息。 #### 六、容器初始化与刷新 - **初始化容器**:调用 `applyInitializers(context)`,执行一系列初始化操作。 - **容器预准备**:调用 `SpringApplicationRunListener.contextPrepared` 方法。 - **添加单实例 Bean**:添加 Spring Boot 特有的单实例 Bean。 - **发布事件**:调用 `SpringApplicationRunListener.contextLoaded` 方法。 #### 七、刷新容器 - 最后一步是调用 `AbstractApplicationContext` 的 `refresh` 方法,完成整个容器的初始化。 - 在 `onRefresh()` 方法中,如果应用是 Web 应用,则会启动 Tomcat 等 Web 容器。 #### 八、关键组件解析 在给定的内容中,还提到了几个关键组件: - **EmbeddedWebServerFactoryCustomizerAutoConfiguration**:负责定制嵌入式 Web 服务器工厂的配置。 - **TomcatWebServerFactoryCustomizer**:专门用于定制 Tomcat 服务器的配置。 - **ServletWebServerFactoryAutoConfiguration**:自动配置 Servlet Web 服务器工厂。 - **ServletWebServerFactoryCustomizer**:定制 Servlet Web 服务器工厂。 - **TomcatServletWebServerFactoryCustomizer**:定制基于 Tomcat 的 Servlet Web 服务器工厂。 - **BeanPostProcessorsRegistrar**:注册 Bean 后置处理器。 - **WebServerFactoryCustomizerBeanPostProcessor**:作为 Bean 后置处理器,用于定制 Web 服务器工厂。 - **ServletWebServerFactoryConfiguration**:Servlet Web 服务器工厂的配置。 - **TomcatServletWebServerFactory**:创建 Tomcat 的 Servlet Web 服务器工厂。 以上组件在 Spring Boot 的启动过程中扮演着重要的角色,共同协作完成了整个应用的启动和配置工作。 #### 九、总结 通过上述分析可以看出,Spring Boot 的启动过程涉及到多个层次的配置与初始化,确保了应用程序能够顺利启动并运行。每个阶段都有其特定的任务和目的,这些任务紧密相连,共同构成了 Spring Boot 应用的启动流程。