首页 > 编程语言 >Spring MVC 源码分析 - 一个请求的旅行过程

Spring MVC 源码分析 - 一个请求的旅行过程

时间:2023-12-26 16:04:41浏览次数:38  
标签:HttpServletRequest 请求 Spring request HttpServletResponse response MVC servlet 源码

在上一篇《WebApplicationContext 容器的初始化》文档中分析了 Spring MVC 是如何创建两个容器的,其中创建Root WebApplicationContext 后,调用其refresh()方法会触发刷新事件,完成 Spring IOC 初始化相关工作,会初始化各种 Spring Bean 到当前容器中,该系列文档暂不分析

我们先来了解一个请求是如何被 Spring MVC 处理的,由于整个流程涉及到的代码非常多,所以本文的重点在于解析整体的流程,主要讲解 DispatcherServlet 这个核心类,弄懂了这个流程后,才能更好的理解具体的源码,回过头再来看则会更加的豁然开朗

整体流程图

Spring MVC 处理请求的流程大致如上图所示

  1. 用户的浏览器发送一个请求,这个请求经过互联网到达了我们的服务器。Servlet 容器首先接待了这个请求,并将该请求委托给 DispatcherServlet 进行处理。
  2. DispatcherServlet 将该请求传给了处理器映射组件 HandlerMapping,并获取到适合该请求的 HandlerExecutionChain 拦截器和处理器对象。
  3. 在获取到处理器后,DispatcherServlet 还不能直接调用处理器的逻辑,需要进行对处理器进行适配。处理器适配成功后,DispatcherServlet 通过处理器适配器 HandlerAdapter 调用处理器的逻辑,并获取返回值 ModelAndView 对象。
  4. 之后,DispatcherServlet 需要根据 ModelAndView 解析视图。解析视图的工作由 ViewResolver 完成,若能解析成功,ViewResolver 会返回相应的 View 视图对象。
  5. 在获取到具体的 View 对象后,最后一步要做的事情就是由 View 渲染视图,并将渲染结果返回给用户。

以上就是 Spring MVC 处理请求的全过程,上面的流程进行了一定的简化,主要涉及到最核心的组件,还有许多其他组件没有表现出来,不过这并不影响大家对主过程的理解。

组件预览

在上一篇《WebApplicationContext 容器的初始化》文档讲述 FramworkServlet 的 onRefresh 方法时,该方法由 DispatcherServlet 去实现,会初始化九大组件,如何初始化的这里暂时不展开讨论,默认会从 spring-webmvc 下面的 DispatcherServlet.properties 文件中读取组件的实现类,感兴趣可以先阅读一下源码

标签:HttpServletRequest,请求,Spring,request,HttpServletResponse,response,MVC,servlet,源码
From: https://blog.51cto.com/u_15668812/8984050

相关文章

  • Spring学习记录之Spring对IoC的实现
    Spring学习记录之Spring对IoC的实现前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使......
  • 浅聊SpringCloud的网关
    为什么要设计网关?上网搜罗了一下,觉得别人说的挺好,就引用了一下,在使用微服务的时候,不同的功能业务会集成一个服务群,而网关是基于服务群上的一个服务层,也是单独暴露给客户端的APIs。客户端对微服务的依赖直接使重构服务变得困难。一种直观的方法是将这些服务隐藏在一个新的服务层后面......
  • Spring Event 与 AOP
    在构建现代化的应用中,日志记录是不可或缺的一环。Spring框架为我们提供了强大的事件机制(SpringEvent)和切面编程(AOP),结合使用可以实现优雅的日志记录,使得代码更加模块化和可维护。本文将介绍如何结合SpringEvent和AOP,以及如何在不同场景下应用这两个强大的特性。1.SpringEvent......
  • 【源码系列#04】Vue3侦听器原理(Watch)
    专栏分享:vue2源码专栏,vue3源码专栏,vuerouter源码专栏,玩具项目专栏,硬核......
  • 34.Appium 源码修改定制
    为什么需要改造开源框架bugfix增强功能提升性能改造方式直接改造:直接改造开源框架,创建特性分支二次封装:不修改原有项目,直接进行上层封装插件改造:利用已有项目的插件或者扩展机制进行定制外挂改造:不修改原有代码的情况打补丁,利用mock、hook方法维护开源......
  • SpringBoot项目导入的时候没有显示父工程
    一、出现错误导入选中要导入的项目的文件夹,然后点击OK,接下来一直next即可。但是导入完了之后没有出现父模块,只有子模块。二、修正错误CTRL+SHIFT+A打开下面的菜单输入maven,选择AddMavenProjects.选择你要导入的工程的pom文件,然后点击OK,父模块就导入了。三、较好的导入方法从......
  • 33.Appium 源码分析
    Appium所有的源代码AppiumserverNode.js系列包adbshellChromeDriver底层引擎UiautomatorjavaWDAseleniumAppiumclient:Python、JavaAppium体系 了解appium/package.json官方git仓库:https://github.com/appium/appium梳理调用......
  • Unity3D MVC框架和MVVM框架优缺点详解
    Unity3D是一款非常流行的游戏开发引擎,它为开发者提供了强大的工具和功能,使得开发者能够轻松地创建各种类型的游戏。在Unity3D中,使用模型-视图-控制器(MVC)框架和模型-视图-视图模型(MVVM)框架可以更好地组织和管理游戏的逻辑和界面。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱......
  • Spring提供的实用纯Java工具类合集
    在SpringFramework里的spring-core核心包里面,有个org.springframework.util里面有不少非常实用的工具类。该工具包里面的工具类虽然是被定义在Spring下面的,但是由于Spring框架目前几乎成了JavaEE实际的标准了,因此我们直接使用也是无妨的,很多时候能够大大的提高我们的生产力。I......
  • 【SpringBootWeb入门-18】案例-准备工作
    1、案例前言在前面的章节中,我们学习完了后端springbootweb开发的基础知识、MySQL数据库以及Mybatis框架,接下来我们来完成一个Web开发的综合案例,通过这个案例我们学习到前端程序、后端程序以及数据库之间是如何交互协作的,同时通过这个案例我们也学习到根据接口文档、开发服务端接......