一、第一阶段:Servlet —— Java Web 的原始形态
基本特征:
- Servlet 是 Java 最早期用于处理 HTTP 请求的规范
- 每一个请求通过 URL 映射到一个具体的 HttpServlet 实现类
- 所有配置集中在 web.xml 文件中
请求处理流程:
浏览器请求 -> Web 容器读取 web.xml -> 找到映射的 Servlet -> 调用 doGet() / doPost()
优势:
- 简单直白
- 开发者完全掌握每个请求的开发逻辑
缺点:
- 每个 URL 都要手动配置映射, web.xml 文件极其臃肿
- 控制器,业务逻辑,视图耦合在一起
- 缺乏统一调度和分层设计,不利于大型项目维护
第二阶段:Spring MVC —— DispatcherServlet 的统一调度
核心改进:
- 引入了 前端控制器 DispatcherServlet:统一处理所有请求,再根据路径,注解或配置路由到具体方法
- 支持注解式开发(如@Controller、@RequestMapping)和 Bean 配置文件
- web.xml 中只需要注册一个 DispatcherServlet,极大地简化了配置
请求处理流程:
浏览器请求 -> DispatcherServlet(web.xml注册)
-> HandlerMapping 查找处理器
-> HandlerAdapter 调用 Controller 方法
-> 视图解析器返回页面或 JSON
优势:
- 实现了 MVC 分层:Controller、Service、Dao 职责清晰
- 注解 + 配置结合,高效灵活
- 内部采用策略模式:HandlerMapping、Adapter、Resolver 等可以替换扩展
缺点:
- 虽然配置比 Servlet 少,但仍需要手动配置 DispatcherServlet
- 部署方式依旧是 war 包,依赖外部 web容器(Tomcat)启动
第三阶段:Spring Boot —— 极简化配置 + 内嵌容器的自动化框架
核心理念:
约定优于配置,自动配置,起步依赖,内嵌服务器
- 使用 @SpringBootApplication 启动主类,不再需要 web.xml
- 自动注册 DispatcherServlet ,无需手动配置
- 内嵌 Tomcat ,由 Java main 方法启动项目,彻底脱离外部服务器
- 支持 application.yml / application.properties 配置方式,全局统一管理参数
- 自动扫描,自动装配,自动注册
请求处理流程:
main() -> SpringApplication.run() 启动程序
-> 创建 ApplicationContext(先于 DispatcherServlet)
-> 自动配置类注册 DispatcherServlet 为 Bean
-> 创建内嵌 Tomcat,并将 DispatcherServlet 动态注册进 ServletContext
-> 请求到达时仍由 DispatcherServlet 分发给 HandlerMapping、HandlerAdapter 等处理
优势:
- 零配置启动,无需 web.xml,无需 DispatcherServlet 注册
- jar 包即可启动:java -jar,便于部署,Docker 打包
- 自动化体系:基于 classpath 中的依赖自动决定配置行为
- 快速构建微服务架构:可与 Spring Cloud 等配合,快速搭建现代架构
缺点:
封装过深,底层行为不透明,对调试和深入理解有门槛
Spring Boot 相对于 Spring MVC 做了哪些关键改变?
1,加载流程对比
Spring MVC 加载流程 (war包 + 外部容器)
- Tomcat 启动
- 读取 web.xml
- 创建并初始化 DispatcherServlet
- DispatcherServlet 创建 WebApplicationContext
- 加载配置文件,扫描@Controller
- 初始化完成,开始处理请求
流程主导权在 Web 容器(Tomcat),Spring 被动接入
Spring Boot 加载流程 (jar包 + 内嵌容器)
- 执行 main() 方法
- 调用 SpringApplication.run() 创建完整的 ApplicationContext
- 自动注册 DispatcherServlet 为 Bean
- 自动创建内嵌 Tomcat
- 将 DispatcherServlet 动态注册进 ServletContext
- 启动完成,开始处理请求
流程主导权在 Spring Boot,Tomcat 被动集成
2,请求流程一样
浏览器请求 -> DispatcherServlet
-> HandlerMapping
-> HandlerAdapter
-> Controller
-> ViewResolver
两种方式最终处理请求的逻辑完全一致,核心区别在启动加载阶段的控制权与顺序。
3,总结:四大关键变化
维度 | Spring MVC | Spring Boot |
---|---|---|
1. Servlet 注册方式 | 通过 web.xml 静态注册 DispatcherServlet | 自动作为 Spring Bean 注册,代码动态注册到 ServletContext |
2. 加载顺序 | DispatcherServlet ➝ 创建 Spring 容器 ➝ 加载 Bean | 创建完整的 Spring 容器 ➝ 注册 DispatcherServlet |
3. 部署方式 | war 包部署到外部容器 | jar 包独立运行 |
4. 启动方式 | 由容器启动项目(Tomcat 读取 war) | 执行 main 方法启动 Spring Boot,反向启动容器 |
Spring Boot 没有改变底层 Servlet 的本质,但它完全反转了启动主导权、自动封装了配置流程,并统一了 DispatcherServlet 的注册、Tomcat 的启动、Bean 的初始化方式。