Spring Boot 能通过 main 方法直接启动 Web 项目,核心是借助嵌入式服务器自动配置机制,将传统 Web 项目需要的 Servlet 容器(如 Tomcat)、Spring 上下文等组件整合到一个可执行 JAR 中,实现“一键启动”。以下是具体流程:

1. 入口:main 方法与 @SpringBootApplication

Spring Boot 项目的启动类通常标注 @SpringBootApplication 注解,并在 main 方法中调用 SpringApplication.run(),这是启动的入口:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        // 启动核心方法
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • @SpringBootApplication 是一个复合注解,包含 @EnableAutoConfiguration(开启自动配置)、@ComponentScan(组件扫描)等核心注解,为启动提供基础配置。
  • SpringApplication.run() 是启动的核心方法,负责初始化容器、加载配置、启动服务器等全流程。

2. SpringApplication 初始化:准备启动环境

SpringApplication.run() 首先会创建 SpringApplication 实例,完成启动前的准备工作:

  • 判断应用类型:通过类路径检测(如是否存在 Servlet 类),确定是 Web 应用(默认)还是非 Web 应用。
  • 加载监听器和初始化器:从 META-INF/spring.factories 中加载自动配置相关的监听器(ApplicationListener)和初始化器(ApplicationContextInitializer),用于监听启动事件和初始化容器。
  • 定位主类:通过 main 方法所在的类,确定启动类(即标注 @SpringBootApplication 的类)。

3. 环境配置:加载 Web 相关配置

run() 方法中,首先会准备应用环境(Environment):

  • 加载配置文件(application.properties/yaml)、系统变量、命令行参数等,包括 Web 相关配置(如 server.port=8080)。
  • 激活环境(如 spring.profiles.active=dev),确保加载对应环境的配置。

4. 创建 Web 专用容器:ServletWebServerApplicationContext

Spring Boot 会根据应用类型创建对应的容器(ApplicationContext):

  • 对于 Web 项目,默认创建 ServletWebServerApplicationContext(Servlet 类型的容器),而非传统 Spring 的 ClassPathXmlApplicationContext
  • 这个容器的特殊之处在于:它内置了创建和启动嵌入式服务器的逻辑。

5. 自动配置:注入 Web 核心组件

通过 @EnableAutoConfiguration 触发自动配置,Spring Boot 会扫描 META-INF/spring.factories 中的自动配置类,为 Web 项目注入核心组件:

  • 嵌入式服务器工厂:如 TomcatServletWebServerFactory(默认),负责创建 Tomcat 实例。
  • Spring MVC 组件:如 DispatcherServlet(前端控制器)、HandlerMapping(请求映射)等,无需手动配置。
  • 其他 Web 相关 Bean:如 CharacterEncodingFilter(编码过滤)、ErrorPageRegistrar(错误页处理)等。

6. 启动嵌入式服务器:Tomcat 自动启动

容器初始化完成后,执行 refresh() 方法(Spring 容器的核心刷新逻辑),其中关键步骤是启动嵌入式服务器:

  1. ServletWebServerApplicationContext 重写了 onRefresh() 方法,在此方法中调用 createWebServer() 创建服务器。
  2. createWebServer() 通过之前自动配置的 TomcatServletWebServerFactory 创建 Tomcat 实例,并根据配置(如端口、超时时间)初始化。
  3. 调用 Tomcat 的 start() 方法,启动服务器,此时 Tomcat 开始监听配置的端口(默认 8080)。
  4. DispatcherServlet 等 Spring MVC 组件注册到 Tomcat 中,确保请求能被 Spring 处理。

7. 应用就绪:接收并处理请求

服务器启动后,Spring Boot 会发布 ApplicationReadyEvent 事件,标识应用已就绪。此时:

  • 外部请求(如 http://localhost:8080/hello)会被 Tomcat 接收,并转发给 DispatcherServlet
  • DispatcherServlet 根据请求路径匹配对应的 @Controller 方法,完成业务处理并返回响应。

核心原理总结

Spring Boot 通过 main 方法启动 Web 项目的本质是:

  1. 借助 @SpringBootApplication 开启自动配置,自动注入 Web 所需的 Spring MVC 组件和嵌入式服务器工厂。
  2. 通过 ServletWebServerApplicationContext 容器,在启动过程中自动创建并启动嵌入式 Tomcat(无需外部部署)。
  3. 将 Spring 容器与嵌入式服务器绑定,使得请求能直接被 Spring 组件处理。

这种设计彻底简化了 Web 项目的部署流程,实现了“java -jar 一键启动”,也是 Spring Boot 相比传统 Spring 项目的核心优势之一。