ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【Spring框架学习(五)】:Spring MVC请求处理流程解析

2026/8/18 19:20:54 拓冰建站 浏览量
【Spring框架学习(五)】:Spring MVC请求处理流程解析 Spring框架学习系列《Spring框架学习一从设计思想到核心架构全面认识Spring》《Spring框架学习二IOC核心原理解析为什么Autowired可以自动注入》《Spring框架学习三Spring Bean生命周期详解》《Spring框架学习四Spring AOP动态代理实现原理》《Spring框架学习五Spring MVC请求处理流程解析》《Spring框架学习六Spring事务实现原理》《Spring框架学习七Spring Boot自动配置原理》《Spring框架学习八Spring源码整体流程总结》一、前言在前面的文章中我们学习了 Spring 的核心能力IOC对象管理Bean生命周期对象创建过程AOP动态代理实现增强这些内容主要围绕 Spring 核心容器展开。但是在实际开发中我们每天接触最多的 Spring 功能之一就是Spring MVC处理HTTP请求。例如RestController RequestMapping(/user) public class UserController { GetMapping(/list) public ListUser list(){ return userService.findAll(); } }当浏览器访问GET /user/list之后请求如何找到 Controller参数如何传递给方法返回对象如何转换成 JSONSpring MVC 内部经历了什么流程这些问题都需要理解 Spring MVC 的核心执行流程。二、什么是Spring MVCSpring MVC是 Spring 提供的一套 Web 开发框架。它基于MVC设计模式MVC分别代表Model模型负责数据。例如UserView视图负责页面展示。例如JSPThymeleafController控制器负责接收请求并处理。例如Controller public class UserController{ }三、传统Servlet开发的问题在早期 Java Web 开发中需要自己编写 Servlet。例如WebServlet(/user) public class UserServlet extends HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response){ } }一个项目大量接口就会产生大量 Servlet。问题类数量多路由管理困难参数解析复杂Spring MVC通过DispatcherServlet统一管理请求。四、Spring MVC核心架构Spring MVC整体流程浏览器 ↓ DispatcherServlet ↓ HandlerMapping ↓ Controller ↓ Service ↓ DAO ↓ 返回数据 ↓ DispatcherServlet ↓ 浏览器其中DispatcherServlet 是核心。五、DispatcherServlet是什么DispatcherServlet中文前端控制器。它是 Spring MVC 的入口,所有请求都会经过它。例如浏览器请求/user/list实际浏览器 ↓ DispatcherServlet ↓ Controller它负责接收请求查找Controller调用方法返回结果六、一次HTTP请求完整流程下面分析访问GET /user/list对应GetMapping(/list) public ListUser list(){ return userService.findAll(); }完整流程1. 浏览器发送请求 ↓ 2. DispatcherServlet接收请求 ↓ 3. HandlerMapping查找Controller ↓ 4. HandlerAdapter执行Controller方法 ↓ 5. Controller调用业务层 ↓ 6. 返回ModelAndView ↓ 7. HttpMessageConverter转换数据 ↓ 8. 返回JSON响应七、第一步DispatcherServlet接收请求请求进入DispatcherServlet核心方法doDispatch()源码位置org.springframework.web.servlet.DispatcherServlet所有请求都会进入doDispatch()它是 Spring MVC 最重要的方法。八、第二步HandlerMapping查找ControllerDispatcherServlet收到请求后第一件事寻找处理这个请求的方法。例如请求/user/listControllerGetMapping(/list) public ListUser list(){ }Spring需要知道哪个方法负责处理它。这个过程由HandlerMapping完成。HandlerMapping作用简单理解根据URL找到对应Controller方法。例如保存映射关系/user/list ↓ UserController.list()常见实现RequestMappingHandlerMapping它负责处理RequestMapping GetMapping PostMapping等注解。九、第三步HandlerAdapter执行方法找到Controller之后Spring不会直接调用。而是通过HandlerAdapter执行。为什么需要HandlerAdapter因为Controller有不同形式例如Controller接口或者注解ControllerSpring需要统一调用。核心方法handle()流程HandlerAdapter ↓ 调用Controller方法 ↓ 获取返回结果十、第四步Controller参数解析Controller方法经常有各种参数例如PostMapping(/save) public User save( RequestBody User user){ }Spring需要完成JSON 一 User对象这个过程由HandlerMethodArgumentResolver参数解析器完成。常见参数RequestParam请求参数?id1转换Long idPathVariable路径参数/user/1转换Long idRequestBody请求JSON{ name:Tom }转换User十一、第五步调用Controller业务代码参数准备完成后Spring通过反射调用方法。例如userController.list();Controller通常不会处理复杂业务。而是调用Service public class UserService{ }然后继续调用DAO。结构Controller ↓ Service ↓ DAO ↓ Database十二、第六步返回数据处理Controller返回GetMapping(/list) public User list(){ return user; }Spring需要Java对象 一 JSON这个过程由HttpMessageConverter完成。例如返回User user;转换{ id:1, name:Tom }默认使用Jackson。十三、ResponseBody原理例如ResponseBody GetMapping(/user) public User user(){ return new User(); }作用告诉Spring不要返回页面直接返回数据。底层使用HttpMessageConverter转换。十四、Spring MVC源码核心类学习Spring MVC源码重点关注作用核心类请求入口DispatcherServlet请求映射HandlerMapping方法执行HandlerAdapter参数解析HandlerMethodArgumentResolver返回处理HttpMessageConverter视图解析ViewResolver十五、Spring MVC完整源码流程整体串起来浏览器请求 ↓ DispatcherServlet ↓ doDispatch() ↓ HandlerMapping ↓ 找到Controller方法 ↓ HandlerAdapter ↓ 参数解析 ↓ 执行Controller ↓ 返回结果 ↓ HttpMessageConverter ↓ JSON响应十六、Spring MVC中的扩展机制Spring MVC能够灵活扩展很大程度依赖接口设计。例如HandlerInterceptor拦截请求。常用于登录验证权限检查流程请求 ↓ Interceptor ↓ ControllerHandlerMethodArgumentResolver扩展参数解析。例如自定义CurrentUser User user自动获取当前用户。HttpMessageConverter扩展数据转换。例如支持JSONXML十七、总结Spring MVC本质就是一个请求分发框架。核心流程请求进入 ↓ DispatcherServlet接管 ↓ HandlerMapping寻找Controller ↓ HandlerAdapter执行方法 ↓ 参数自动绑定 ↓ 业务处理 ↓ 结果转换 ↓ 返回客户端理解 Spring MVC 后就能够明白RequestMapping为什么可以映射URLRequestBody为什么能转换JSONResponseBody为什么能返回对象Controller方法为什么可以自动执行下一篇文章《Spring框架学习六Spring事务实现原理》将深入分析 Spring 声明式事务的实现过程以及事务为什么依赖 AOP。