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

spring mvc 整体处理流程原理

流程总控 DispatcherServlet

DispatcherServlet 是 Spring MVC 中的核心组件之一,负责处理 HTTP 请求并将请求分发到适当的处理器(如控制器 Controller)。它是一个前端控制器(Front Controller),即所有请求首先由它处理,然后根据配置将请求转发给具体的处理逻辑。

在 Spring Web 应用中,DispatcherServlet 起着至关重要的作用,它充当了整个 Web 应用的请求调度中心,负责协调请求和响应的流程。可以将它看作是整个 Spring MVC 框架的入口点。

DispatcherServlet作为一个servlet需要显示的进行配置,可以在web容器如tomcat的web.xml作为一个普通的servlet进行配置。

请求映射HandlerMapping`

HandlerMapping 的主要作用是根据 HTTP 请求的 URL 来找到与之匹配的处理器(通常是一个 @Controller 类中的方法)。HandlerMapping 的初始化是 Spring MVC 请求处理过程中非常关键的一步,它决定了 DispatcherServlet 如何定位到对应的处理方法(Handler)。

Spring MVC 提供了多种类型的 HandlerMapping 实现,最常用的是 RequestMappingHandlerMapping,它负责处理基于注解(如 @RequestMapping@GetMapping@PostMapping 等)的方法映射。

RequestMappingHandlerMapping:最常用的 HandlerMapping,用于解析和处理基于注解的 URL 映射(如 @RequestMapping@GetMapping@PostMapping)。

BeanNameUrlHandlerMapping:根据 Spring Bean 的名称来匹配请求 URL。

SimpleUrlHandlerMapping:根据静态 URL 路径进行映射。

AnnotationMethodHandlerMapping(Spring 3.x):用于处理基于注解的请求映射,通常被 RequestMappingHandlerMapping 替代。

RequestMappingHandlerMapping 会扫描所有的控制器类(即标注了 @Controller@RestController 的类),并查找方法上的 @RequestMapping 注解。它会根据 @RequestMapping 中定义的 URL 路径、HTTP 方法、参数等信息,建立请求与方法之间的映射关系。

实现了InitializingBean接口,在afterPropertiesSet()方法会调用initHandlerMethods();进行注解扫描初始化。

会拿出容器中所有的bean,判断是不是handler

	protected boolean isHandler(Class<?> beanType) {return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));}

如果类上有Controller或RequestMapping类型的注解,就是handler。然后通过detectHandlerMethods()方法读取该handler上的mapping信息。也就是找到所有被RequestMapping注解修饰的方法。

RequestMapping注解上配置的信息会被解析成RequestMappingInfo对象存储,最后registerHandlerMethod()方法将mapping方法注册到mappingRegistry中。

/**
这里的handler就是上面的@Controller修饰的bean,method就是@RequestMapping修饰的方法,
mapping就是注解上的配置信息 ,RequestMappingInfo实例类
*/	
protected void registerHandlerMethod(Object handler, Method method, T mapping) {this.mappingRegistry.register(mapping, handler, method);
}

DispatcherServlet接收到请求后会调用doDispatch方法进行请求分发,然后拿出所有的HandlerMapping类实例调用getHandler(HttpServletRequest request)来根据请求获取可能匹配的handler进行调用。在RequestMappingHandlerMapping 实例类中最后会调用getHandlerInternal(HttpServletRequest request)方法来从mappingRegistry中获取匹配的handler进行调用处理。

请求处理HandlerAdapter

DispatcherServlet找到对应的handler处理方法后,不是直接进行调用,而是使用HandlerAdapter进行调用。根据 Handler 的类型,Spring MVC 会选择合适的 HandlerAdapter 来处理。HandlerAdapter 将请求的处理和具体的控制器方法解耦,DispatcherServlet 不需要关心控制器方法的实现细节。所有 HandlerAdapter 都实现了相同的接口,DispatcherServlet 只需要与适配器交互,而不需要关心请求的具体处理方式。它将请求和控制器方法之间的调用过程解耦。

最常用的HandlerAdapter是RequestMappingHandlerAdapter,用来处理@RequestMapping的请求。最后方法调用在invokeHandlerMethod()方法完成,它会通过反射调用方法,绑定请求参数到控制器方法的参数,处理 @RequestParam, @PathVariable, @RequestBody 等注解。

handleradapter会将所有请求相关信息封装成一个ServletInvocableHandlerMethod extends InvocableHandlerMethod对象,然后通过其invokeAndHandle()方法完成方法调用。

参数绑定HandlerMethodArgumentResolver

要想反射调用方法,第一步需要绑定方法调用的相关参数。HandlerMethodArgumentResolver 是 Spring MVC 中用于解析控制器方法参数的接口。每个解析器负责将 HTTP 请求中的一个参数(例如查询参数、路径变量、请求体等)绑定到控制器方法的一个参数上。

常见的HandlerMethodArgumentResolver 参数解析器:

参数解析器作用
RequestParamMethodArgumentResolver绑定 URL 查询参数或表单参数到方法参数,处理 @RequestParam 注解或无注解的参数绑定
PathVariableMethodArgumentResolver处理 @PathVariable 注解的参数绑定
RequestBodyMethodArgumentResolver处理 @RequestBody 注解的参数绑定 将请求体中的 JSON 数据绑定到方法参数
ModelAttributeMethodArgumentResolver处理 @ModelAttribute 注解的参数绑定
RequestHeaderMethodArgumentResolve绑定 HTTP 请求头中的数据到方法参数 @RequestHeader

handlerAdapter使用参数解析器的组合类HandlerMethodArgumentResolverComposite,其中有多个不同的参数解析器,来解析不同的请求参数。解析参数具体使用的参数解析器的resolveArgument()方法。

返回值处理HandlerMethodReturnValueHandler

方法调用完后会有返回值,将控制器方法的返回值(通常是一个对象)处理成合适的响应形式(如视图、JSON 数据、XML 数据等)。这个过程主要涉及 HandlerMethodReturnValueHandler,它负责根据返回值的类型和控制器方法的注解,将返回值转换为适当的响应,并交给 DispatcherServlet 来生成最终的 HTTP 响应。

HandlerMethodReturnValueHandler 是 Spring MVC 中用于处理控制器方法返回值的接口。它负责将控制器方法的返回值处理成 HTTP 响应的最终形式。

public interface HandlerMethodReturnValueHandler {boolean supportsReturnType(MethodParameter returnType);void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}
  • supportsReturnType():判断当前处理器是否支持处理该返回值类型。
  • handleReturnValue():负责将返回值处理成最终的响应。

常见的返回值处理器:

HandlerMethodReturnValueHandler 实现类作用处理的返回值类型典型注解或场景
ModelAndViewMethodReturnValueHandler处理 ModelAndView 类型的返回值处理 ModelAndView 类型,包含视图名和模型数据,并交由 ViewResolver 解析并渲染视图。ModelAndView
ViewMethodReturnValueHandler处理 View 类型的返回值处理 View 类型,直接返回一个视图对象,用于渲染响应。View
HttpEntityMethodReturnValueHandler处理 HttpEntityResponseEntity 类型的返回值处理 HttpEntityResponseEntity,包括响应的内容和状态码。HttpEntity / ResponseEntity
HttpServletResponseMethodReturnValueHandler处理 HttpServletResponse 类型的返回值直接将返回值写入到 HttpServletResponse 对象中,用于输出流、文件等场景。HttpServletResponse
ResponseBodyMethodReturnValueHandler处理带 @ResponseBody 注解的方法返回值将返回值序列化为 JSON、XML 或其他格式并写入响应体。@ResponseBody / @RestController
ModelMethodReturnValueHandler处理 Model 类型的返回值将返回的模型对象放入 Model 中,在视图渲染时使用。Model
RedirectViewMethodReturnValueHandler处理 RedirectView 类型的返回值返回重定向的视图(RedirectView),告诉浏览器进行重定向。RedirectView
ViewNameMethodReturnValueHandler处理 String 类型的视图名称处理返回值为视图名称的情况,直接将视图名称解析为视图并渲染。String(视图名称)
DeferredResultMethodReturnValueHandler处理 DeferredResult 类型的返回值处理 DeferredResult 类型,支持异步请求响应,适用于长时间运行的请求或异步任务。DeferredResult
CallableMethodReturnValueHandler处理 Callable 类型的返回值处理 Callable 类型,支持异步处理请求的返回值。Callable
http://www.dtcms.com/a/308730.html

相关文章:

  • std::string 与 QString 的对比与转换:API 设计风格及实例分析
  • 2025 年 7 月 TIOBE 指数
  • React Filber及核心原理
  • Spring Boot 3.x 使用多数据源动态切换为何必须用 dynamic-datasource-spring-boot3-starter
  • 第13届蓝桥杯C++青少组中/高级组选拔赛2022年1月22日真题
  • visual studio 安装总结
  • 笔试——Day24
  • Faker虚假数据生成功能
  • 使用ANSYS Fluent和群体平衡模型对搅拌罐反应器中的气泡动力学进行建模
  • 运作管理学习笔记1-运作管理基础
  • 八、Vue前端项目案例关键过程记录
  • Redis高频问题全解析
  • NFLSOI 7.25 题解
  • 2025电赛e题:openmv识别过程丢失矩形
  • 第三十篇:AI的“思考引擎”:神经网络、损失与优化器的核心机制【总结前面2】
  • 项目推进难的原因有哪些?问题及应对
  • 汇编语言中的溢出(Overflow)与下溢(Underflow)
  • 03-Redis哨兵集群实现
  • 新手教程:用外部 PostgreSQL 和 Zookeeper 启动 Dolphinscheduler
  • 8.1-使用向量存储值列表
  • 2025年蓝桥杯青少图形化编程国考真题——摆放玩具
  • 大语言模型信息抽取系统解析
  • [12月考试] B
  • MySQL中join联表的原理
  • 前端基础之《Vue(28)—Vue3 ref相关API》
  • web应用从服务器主动推动数据到客户端的方式
  • Windows 11下IDEA中使用git突然变得卡慢及解决办法
  • Spring-rabbit使用实战五
  • 生信软件49 - 全基因组亚硫酸氢盐测序(WGBS)比对与甲基化水平调用工具BSseeker2
  • Linux 进程管理与计划任务