当前位置: 首页 > 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——在卷积神经网络中…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...