当前位置: 首页 > news >正文

面试官:讲一讲Spring MVC源码解析

好看的皮囊千篇一律、有趣的灵魂万里挑一
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。还有机会获得内推名额。

在这里插入图片描述

文章目录

  • Spring MVC 源码解析
  • 1. DispatcherServlet
  • 2. HandlerMapping
  • 3. HandlerAdapter
  • 4. ViewResolver
  • 5. ModelAndView
  • 总结


Spring MVC 源码解析

Spring MVC 是 Spring 框架的核心组件之一,用于构建基于 Web 的应用程序。它实现了 Model-View-Controller(MVC)模式,使开发者可以方便地管理业务逻辑、视图和数据交互。以下是 Spring MVC 请求处理的主要流程及源码解析。


1. DispatcherServlet

DispatcherServlet 是 Spring MVC 的中央控制器,所有的 HTTP 请求都会先到达 DispatcherServlet。它负责协调请求的处理流程。

DispatcherServletdoDispatch() 方法中,定义了处理请求的核心逻辑:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;ModelAndView mv = null;Exception dispatchException = null;try {// 1. 获取处理器(Handler)mappedHandler = getHandler(processedRequest);if (mappedHandler == null) {noHandlerFound(processedRequest, response);return;}// 2. 获取处理器适配器(HandlerAdapter)HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// 3. 执行前置拦截器(PreHandler Interceptor)if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// 4. 执行处理器(Handler)逻辑,生成 ModelAndViewmv = ha.handle(processedRequest, response, mappedHandler.getHandler());// 5. 执行后置拦截器(PostHandler Interceptor)mappedHandler.applyPostHandle(processedRequest, response, mv);} catch (Exception ex) {dispatchException = ex;} catch (Throwable err) {dispatchException = new NestedServletException("Handler dispatch failed", err);} finally {// 6. 处理结果并渲染视图processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}
}

该方法的执行流程如下:

1、获取处理器:通过 getHandler() 方法,根据请求 URL 获取适当的处理器(Handler),通常是一个 Controller。
2、获取适配器:通过 getHandlerAdapter() 获取对应处理器的适配器(HandlerAdapter),负责调用具体的处理器方法。
3、执行前置拦截器:调用拦截器链的 applyPreHandle() 方法。
4、处理请求:调用 HandlerAdapter 的 handle() 方法,执行业务逻辑,并返回 ModelAndView 对象。
5、执行后置拦截器:调用拦截器链的 applyPostHandle() 方法。
6、渲染视图:调用 processDispatchResult() 进行结果处理,包括视图渲染。

2. HandlerMapping

HandlerMapping 负责根据请求 URL 映射到对应的处理器。Spring MVC 中常用的 HandlerMapping 实现有:

RequestMappingHandlerMapping:处理基于注解的映射(如 @RequestMapping)。
RequestMappingHandlerMapping 的核心逻辑是在 getHandlerInternal() 方法中根据请求查找相应的 Handler:

@Override
protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {// 根据请求的 URL 查找对应的 HandlerMethodHandlerMethod handlerMethod = lookupHandlerMethod(request, getHandlerMethods());return (handlerMethod != null ? handlerMethod.createWithResolvedBean() : null);
}

这里的 lookupHandlerMethod() 方法根据请求 URL 查找已注册的处理方法,这些方法通常使用 @RequestMapping 注解。

3. HandlerAdapter

HandlerAdapter 负责调用处理器执行实际的业务逻辑。Spring MVC 通过 HandlerAdapter 将不同类型的处理器(如 Controller 接口实现类或注解控制器)适配成统一的调用方式。

RequestMappingHandlerAdapter 是最常用的 HandlerAdapter,其 handle() 方法如下:

@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return invokeHandlerMethod(request, response, (HandlerMethod) handler);
}

invokeHandlerMethod() 方法负责调用实际的处理器方法,并生成 ModelAndView:

protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {// 根据方法签名解析参数并调用处理方法ModelAndView mav = this.invokeAndHandle(webRequest, response, handlerMethod);return mav;
}

4. ViewResolver

ViewResolver 负责根据视图名解析实际的视图对象,通常是 JSP、Thymeleaf 等模板引擎生成的页面。Spring MVC 支持多种视图解析器,常见的是 InternalResourceViewResolver,它将逻辑视图名称解析为 JSP 文件路径。

InternalResourceViewResolver 的 resolveViewName() 方法:

@Override
protected View loadView(String viewName, Locale locale) throws Exception {// 根据视图名称解析 JSP 文件路径String url = getPrefix() + viewName + getSuffix();return new InternalResourceView(url);
}

5. ModelAndView

ModelAndView 是一个封装类,用于传递处理结果和视图信息。它包含模型数据和视图名称:

public class ModelAndView {private Object view;private Map<String, Object> model = new LinkedHashMap<>();
}

处理器方法执行后返回的 ModelAndView 对象会被 DispatcherServlet 传递给 ViewResolver 进行视图解析和渲染。

总结

Spring MVC 的核心流程通过 DispatcherServlet 调度请求,根据请求 URL 查找处理器,然后通过 HandlerAdapter 调用处理器执行业务逻辑,最终由 ViewResolver 解析视图并返回结果。这一系列的组件协作形成了强大的 Web 框架,既能支持注解驱动,也能扩展成多种视图技术。

可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

相关文章:

面试官:讲一讲Spring MVC源码解析

好看的皮囊千篇一律、有趣的灵魂万里挑一 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】获取福利&#xff0c;回复【项目】获取项目源码&#xff0c;回复【简历模板】获取简历模板&#xff0c;回复【学习路线图】获取学习路线图。…...

815. 公交路线(24.9.17)

题目 给你一个数组 routes&#xff0c;表示一系列公交线路。其中每个 routes[i] 表示一条公交线路&#xff0c;第 i 辆公交车将会在上面循环行驶。例如&#xff0c;路线 routes[0][1,5,7] 表示第 0 辆公交车会一直按序列 1->5->7->1->5->7->1->... 这样的…...

Rust: Warp RESTful API 如何得到客户端IP?

在使用 Rust 的 Warp 框架来创建 RESTful API 时&#xff0c;如果你想要获取客户端的 IP 地址&#xff0c;通常需要在处理 HTTP 请求的函数中查看请求的头部或者底层连接的信息。不过&#xff0c;Warp 本身并不直接提供一个简便的 API 来直接获取客户端的 IP 地址&#xff0c;因…...

添加选择登录ssh终端

吼吼,这次成了一个小的瑞士军刀了 … … 一次性功能齐全,虽然只支持win10及以上...

【基于 Delphi 的人才管理系统】

基于 Delphi 的人才管理系统可以帮助企业或组织管理员工的信息&#xff0c;包括招聘、培训、绩效评估等方面。这种系统通常包括员工档案管理、职位发布、应聘者跟踪、培训计划安排等功能。下面是一个简化的人才管理系统设计方案及其代码示例。 系统设计概览 员工档案管理&…...

GetMaterialApp组件的用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"Get包简介"相关的内容&#xff0c;本章回中将介绍GetMaterialApp组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经…...

ubuntu安装mysql 8.0忘记root初始密码,如何重新修改密码

1、停止mysql服务 $ service mysql stop 2、修改my.cnf文件 # 修改my.cnf文件&#xff0c;在文件新增 skip-grant-tables&#xff0c;在启动mysql时不启动grant-tables&#xff0c;授权表 $ sudo vim /etc/mysql/my.cnf [mysqld] skip-grant-tables 3、启动mysql服务 servic…...

Vue3项目开发——新闻发布管理系统(七)

文章目录 九、新闻分类管理模块设计开发1、新闻分类主页面设计2、封装页面组件3、改造页面4、新闻分类表格渲染4.1封装API,获取新闻分类数据4.2 表格动态渲染4.3表格增加 loading 效果5、实现新闻分类添加和编辑功能5.1 点击显示弹层5.2封装弹层组件 CateEdit5.3 准备弹层表单…...

ICMP

目录 1. 帧格式2. ICMPv4消息类型(Type = 0,Code = 0)回送应答 /(Type = 8,Code = 0)回送请求(Type = 3)目标不可达(Type = 5,Code = 1)重定向(Type = 11)ICMP超时(Type = 12)参数3. ICMPv6消息类型回见TCP/IP 对ICMP协议作介绍 ICMP(Internet Control Messag…...

Unity-Transform类-旋转

角度度相关 相对世界坐标角度 print(this.transform.eulerAngles); 相对父对象角度 print(this.transform.localEulerAngles); 注意&#xff1a;设置角度和设置位置一样 不能单独设置xyz 要一起设置 如果我们希望改变的 角度 是面板上显示的内容 那是改…...

如何使用 Vue 3 的 Composition API

Vue 3 引入了 Composition API&#xff0c;它提供了一种更灵活的方式来组织和重用逻辑。与 Vue 2 的 Options API 相比&#xff0c;Composition API 允许你将组件的逻辑按功能组织到函数中&#xff0c;而不是将它们分散到组件选项对象中。以下是如何在 Vue 3 中使用 Compositio…...

Mamba环境配置教程【自用】

1. 新建一个Conda虚拟环境 conda create -n mamba python3.102. 进入该环境 conda activate mamba3. 安装torch&#xff08;建议2.3.1版本&#xff09;以及相应的 torchvison、torchaudio 直接进入pytorch离线包下载网址&#xff0c;在里面寻找对应的pytorch以及torchvison、…...

2021 年 6 月青少年软编等考 C 语言二级真题解析

目录 T1. 数字放大思路分析 T2. 统一文件名思路分析 T3. 内部元素之和思路分析 T4. 整数排序思路分析 T5. 计算好数思路分析 T1. 数字放大 给定一个整数序列以及放大倍数 x x x&#xff0c;将序列中每个整数放大 x x x 倍后输出。 时间限制&#xff1a;1 s 内存限制&#x…...

2024网络安全、应用软件系统开发决赛技术文件

用软件系统开发技术方案 一、竞赛项目 2024 年全国电子信息行业第二届职工技能竞赛四川省应用 软件系统开发选拔赛分理论比赛和实际操作两个部分。理论比赛 成绩占30%&#xff0c;实际操作成绩占70%。 二、理论比赛 1、理论比赛范围 ①计算机系统基础知识&#xff1a; …...

CSP-J初赛每日题目2(答案)

二进制数 00100100和 00010100 的和是( )。 A.00101000 B.01100111 C.01000100 D.00111000 正确答案&#xff1a; D \color{green}{正确答案&#xff1a; D} 正确答案&#xff1a;D 解析&#xff1a; \color{red}{解析&#xff1a;} 解析&#xff1a; 00100100 36 \color{r…...

为什么Node.js不适合CPU密集型应用?

Node.js不适合CPU密集型应用的原因主要基于其设计理念和核心特性&#xff0c;具体可以归纳为以下几点&#xff1a; 单线程模型 Node.js采用单线程模型来处理用户请求和异步I/O操作。虽然这种模型在处理高并发I/O密集型任务时非常高效&#xff0c;因为它避免了传统多线程模型中的…...

数模原理精解【12】

文章目录 广义线性模型多元回归中的 R 2 R^2 R2&#xff08;也称为决定系数&#xff09;一、定义二、性质三、计算四、例子五、例题 偏相关系数一、定义二、计算三、性质四、例子 多元回归相关定义性质假设检验定义计算性质检验方法例子和例题例子例题例子 参考文献 广义线性模…...

steamdeck执行exe文件

命令行安装&#xff1a; sudo pacman xxxx //"xxxx"为软件名 &#xff0c;或者搜索“arch linux 软件安装命令” 安装wine及wineZGUI 命令行输入&#xff1a; sudo pacman -S wine 后面需要输入密码&#xff0c;deck设置的用户密码即可&#xff08;输入无反应是正…...

三、集合原理-3.2、HashMap(下)

3.2、HashMap&#xff08;下&#xff09; 3.2.2、单线程下的HashMap的工作原理(底层逻辑)是什么&#xff1f; 答&#xff1a; HashMap的源码位于Java的标准库中&#xff0c;你可以在java.util包中找到它。 以下是HashMap的简化源码示例&#xff0c;用于说明其实现逻辑&#…...

【激活函数】Activation Function——在卷积神经网络中的激活函数是一个什么样的角色??

【激活函数】Activation Function——在卷积神经网络中的激活函数是一个什么样的角色&#xff1f;&#xff1f; Activation Function——在卷积神经网络中的激活函数是一个什么样的角色&#xff1f;&#xff1f; 文章目录 【激活函数】Activation Function——在卷积神经网络中…...

寒冬降临:当资本撤出AI测试赛道

2026年初&#xff0c;全球资本市场对AI技术的狂热投资骤然降温。随着VC基金转向更保守的资产配置&#xff0c;依赖融资的AI测试工具开发商面临生存危机&#xff1a;初创公司批量裁员&#xff0c;开源项目停止维护&#xff0c;企业采购的智能测试平台因无法续约沦为“断线木偶”…...

第二桌面 + 小龙虾:让企业AI智能体安全落地、全员可用

本文发布于2026年4月1日。引言&#xff1a;从“养虾”到“用虾”&#xff0c;AI落地需要新底座过去几个月&#xff0c;OpenClaw&#xff08;昵称“小龙虾”&#xff09;在开发者圈子里火得一塌糊涂。这个开源AI智能体网关&#xff0c;能听懂人话&#xff0c;还能替你操作电脑、…...

SEED数据集之外:脑电情感识别还有哪些开源数据集值得一试?

SEED数据集之外&#xff1a;脑电情感识别领域五大开源数据集深度评测 当我在实验室第一次尝试构建情感识别模型时&#xff0c;和大多数初学者一样&#xff0c;首先接触到的就是SEED数据集。但随着研究的深入&#xff0c;我逐渐发现这个领域远比想象中丰富——不同诱发范式、采集…...

算法部署设计,Sm3国密算法的硬件ip设计,纯v手写代码,图一为ip接口,图二为资源消耗

算法部署设计&#xff0c;Sm3国密算法的硬件ip设计&#xff0c;纯v手写代码&#xff0c;图一为ip接口&#xff0c;图二为资源消耗&#xff0c;图三四为封装为axilite接口并在开发版下板测试&#xff0c;图五为开发版实测结果 直接联系内容包括:sm3的软件python实现代码&#xf…...

LibreCAD:完全免费的2D CAD软件终极指南,告别昂贵许可证

LibreCAD&#xff1a;完全免费的2D CAD软件终极指南&#xff0c;告别昂贵许可证 【免费下载链接】LibreCAD LibreCAD is a cross-platform 2D CAD program written in C17. It can read DXF/DWG files and can write DXF/PDF/SVG files. It supports point/line/circle/ellipse…...

500套帐篷发往西非:我们凭什么拿下这单?

一句吐槽&#xff0c;让我们抓住了机会年初&#xff0c;天津京路发科技收到一封西非询盘&#xff1a;500套支架帐篷&#xff0c;用于安置点。客户顺带吐槽了一句&#xff1a;“之前的帐篷&#xff0c;没撑过上一个雨季。”我们懂了——价格不是关键&#xff0c;耐造才是。先看气…...

在wsl中利用快马平台五分钟搭建flask博客后端原型

最近在Windows系统下折腾WSL&#xff08;Windows Subsystem for Linux&#xff09;时&#xff0c;发现结合InsCode(快马)平台可以快速搭建项目原型&#xff0c;特别适合需要Linux环境特性的开发验证。就拿搭建一个Flask博客后端来说&#xff0c;传统方式从零开始配置环境、编写…...

DeepSeek-Coder-V2-Lite-Instruct用户调研:开发者眼中的AI编程助手痛点与需求

DeepSeek-Coder-V2-Lite-Instruct用户调研&#xff1a;开发者眼中的AI编程助手痛点与需求 【免费下载链接】DeepSeek-Coder-V2-Lite-Instruct 开源代码智能利器——DeepSeek-Coder-V2&#xff0c;性能比肩GPT4-Turbo&#xff0c;全面支持338种编程语言&#xff0c;128K超长上下…...

从拆解到驱动:手把手教你用IMX6ULL驱动OV5640摄像头模块(附完整代码)

从拆解到驱动&#xff1a;手把手教你用IMX6ULL驱动OV5640摄像头模块&#xff08;附完整代码&#xff09; 1. 硬件连接与接口解析 OV5640作为一款500万像素的CMOS图像传感器&#xff0c;支持DVP和MIPI两种接口模式。在IMX6ULL平台上&#xff0c;我们选择使用DVP并行接口进行连接…...

高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用

高效安全的网页资源提取方案&#xff1a;猫抓开源工具的技术实现与专业应用 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代&#xff…...