
Spring Boot 是如何通过 main 方法启动 web 项目的?
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 容器的核心刷新逻辑),其中关键步骤是启动嵌入式服务器:
ServletWebServerApplicationContext
重写了onRefresh()
方法,在此方法中调用createWebServer()
创建服务器。createWebServer()
通过之前自动配置的TomcatServletWebServerFactory
创建 Tomcat 实例,并根据配置(如端口、超时时间)初始化。- 调用 Tomcat 的
start()
方法,启动服务器,此时 Tomcat 开始监听配置的端口(默认 8080)。 - 将
DispatcherServlet
等 Spring MVC 组件注册到 Tomcat 中,确保请求能被 Spring 处理。
7. 应用就绪:接收并处理请求
服务器启动后,Spring Boot 会发布 ApplicationReadyEvent
事件,标识应用已就绪。此时:
- 外部请求(如
http://localhost:8080/hello
)会被 Tomcat 接收,并转发给DispatcherServlet
。 DispatcherServlet
根据请求路径匹配对应的@Controller
方法,完成业务处理并返回响应。
核心原理总结
Spring Boot 通过 main
方法启动 Web 项目的本质是:
- 借助
@SpringBootApplication
开启自动配置,自动注入 Web 所需的 Spring MVC 组件和嵌入式服务器工厂。 - 通过
ServletWebServerApplicationContext
容器,在启动过程中自动创建并启动嵌入式 Tomcat(无需外部部署)。 - 将 Spring 容器与嵌入式服务器绑定,使得请求能直接被 Spring 组件处理。
这种设计彻底简化了 Web 项目的部署流程,实现了“java -jar
一键启动”,也是 Spring Boot 相比传统 Spring 项目的核心优势之一。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 surfingYu
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果