SpringBoot是如何实现main方法启动Web项目的?
1 个回答
鸟随鸾凤飞腾远,人伴贤良品自高。白秀当 `SpringApplication.run()` 被调用时,它会启动 Spring Boot 应用,并触发一系列步骤来初始化 Spring 上下文和内嵌 Web 服务器。下面是这个过程的详细步骤: ### 1. 调用 `SpringApplication.run()` `SpringApplication.run()` 是 Spring Boot 应用的启动入口,它会创建 `SpringApplication` 实例并执行 `run()` 方法。主要的流程如下: 1. **实例化 `SpringApplication`**:通过传入的主类(`@SpringBootApplication` 标注的类)创建 `SpringApplication` 实例。 2. **决定应用类型**:在 `SpringApplication` 的构造方法中,通过检查类路径中的依赖,来确定应用类型,例如 Web 应用或非 Web 应用。Web 应用的类型会设置为 `SERVLET`。 3. **调用 `SpringApplication#run()`**:此方法会执行一系列准备工作,并最终启动 Spring 应用上下文。 ### 2. 创建 `ApplicationContext` 在 `SpringApplication#run()` 中,会选择并创建合适的 `ApplicationContext`,具体取决于应用类型: - 对于 Web 应用,Spring Boot 会创建 `AnnotationConfigServletWebServerApplicationContext`,这是一个特殊的 `ApplicationContext`,具备启动内嵌 Web 服务器的能力。 ### 3. 调用 `refresh()` 方法 创建 `ApplicationContext` 后,Spring Boot 会调用 `refresh()` 方法,来完成整个 Spring 上下文的启动流程,包括加载 Bean 定义、创建 Bean 实例和执行初始化工作。`refresh()` 是一个关键方法,其中有以下两个步骤至关重要: 1. **`prepareBeanFactory()`**:设置 Bean 工厂的属性,包括对环境变量的解析、配置类路径等基础设置。 2. **`onRefresh()`**:`refresh()` 内部会调用 `onRefresh()` 方法,来完成与 Web 服务器相关的初始化操作。这一步由 `AnnotationConfigServletWebServerApplicationContext` 实现,其中 `onRefresh()` 的逻辑会触发 Web 服务器的启动。 ### 4. 调用 `createWebServer()` 启动 Web 服务器 在 `onRefresh()` 方法中,Spring Boot 会调用 `createWebServer()` 方法,这一步会真正创建和启动内嵌 Web 服务器: - `createWebServer()` 方法中会检查项目依赖,找到 `ServletWebServerFactory` 的合适实现类。Spring Boot 提供了三个主要实现类: 1. **`TomcatServletWebServerFactory`**:默认的实现类,用于创建和配置 Tomcat 服务器。 2. **`JettyServletWebServerFactory`**:用于创建和配置 Jetty 服务器。 3. **`UndertowServletWebServerFactory`**:用于创建和配置 Undertow 服务器。 - **默认情况**下,Spring Boot 会使用 `TomcatServletWebServerFactory` 来创建 Tomcat 服务器实例。 - 调用 `factory.getWebServer()` 方法来启动 Web 服务器实例,`getWebServer()` 方法返回一个 `WebServer` 实例,并调用其 `start()` 方法启动服务器,绑定端口,并开始监听 HTTP 请求。 ### 5. Web 服务器启动完成,Spring Boot 应用开始监听请求 内嵌 Web 服务器启动完成后,`DispatcherServlet` 也会被注册到服务器中,作为请求分发器,处理所有进入的 HTTP 请求。至此,Spring Boot 应用已完全启动,开始监听并处理请求。 ### 流程总结 1. **`SpringApplication.run()`** 启动应用。 2. **创建 `ApplicationContext`**,Web 应用使用 `AnnotationConfigServletWebServerApplicationContext`。 3. **调用 `refresh()` 方法**,在其中调用 `onRefresh()`,进入 Web 服务器启动流程。 4. **调用 `createWebServer()` 方法**,使用 `ServletWebServerFactory` 创建 Web 服务器。 - 默认使用 `TomcatServletWebServerFactory`,也可以选择 `JettyServletWebServerFactory` 或 `UndertowServletWebServerFactory`。 5. **Web 服务器启动**,应用开始监听 HTTP 请求。编辑于 2024-11-24 04:11 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

