【深入浅出spring】Spring MVC 流程解析

前言

其实一年前就想系统地记录下自己阅读spring源码的收获,搞一个深入浅出spring的系列文章,但是因为工作原因,迟迟没有下笔。今天终于可以开始自己一年前的计划了,言归正传,首先开始spring mvc相关的内容。

文本主要从流程角度介绍spring mvc的整个工作原理,对spring mvc有一个整体的了解,具体实现细节不在本文的介绍范畴中。

概述

Spring MVC 是目前主流的Wew MVC框架之一。两个核心点:

  • 处理器映射:选择使用哪个控制器来处理请求
  • 请求参数解析 + 返回数据解析
  • 视图解析器:选择结果应该如何渲染

以下分析基于spring 5.0.4版本源码

运行原理

概述

clipboard.png


  1. 首先用户发送请求,DispatcherServlet实现了Servlet接口,整个请求处理流:HttpServlet.service -> FrameworkServlet.doGet -> FrameworkServlet.processRequest -> DispatcherServlet.doService -> DispatcherServlet.doDispatchdoDispatch(HttpServletRequest request, HttpServletResponse response)方法即为整个spring mvc的处理流程。
  2. 获取url请求对应的处理方法,遍历handlerMappings列表,获取对象HandlerExecutionChain(包含一个处理器 handler 如HandlerMethod 对象、多个 HandlerInterceptor 拦截器对象)。此处的handlerMappings列表为上下文中所有HandlerMapping接口的实现类(如图中列举了4个),遍历handlerMappings列表,针对每个handlerMapping试图获取HandlerExecutionChain,一旦成功(不为null),即返回。这部分的详细分析见【深入浅出spring】Spring MVC 流程解析 -- HanndlerMapping
  3. 获取对应的 HandlerAdapter,HandlerAdapter 将会把2中的handler包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。DispatcherServlet中的HandlerAdapter列表如图中所列的3种,依次遍历,调用HanderAdapter.supports判断是否支持。这部分的详细分析见【深入浅出spring】Spring MVC 流程解析 -- HandlerAdapter
  4. 调用Controller的具体方法处理请求,并返回一个 ModelAndView。HandlerAdapter会为每一个请求生成一个ServletInvocableHandlerMethod实例,核心方法invokeAndHandle,包括输入参数的处理和返回数据的解析。这部分的详细分析见【深入浅出spring】Spring MVC 流程解析 -- InvocableHandlerMethod
  5. 视图解析,遍历DispatcherServlet的ViewResolver列表,获取对应的View对象,入口方法DispatcherServlet.processDispatchResult
  6. 渲染,调用5中获取的View的render方法,完成对Model数据的渲染。此处的 Model 实际是一个 Map 数据结构。
  7. DispatcherServlet 将6中渲染后的数据返回响应给用户,到此一个流程结束。

处理流程

附上代码级的方法流,其中灰色标识主流程,绿色为DispathcerServlet.doDispatch方法中的流程,红色为HandlerAdapter.handler方法中的流程

clipboard.png

实现类罗列

handlerMappings:
  • RequestMappingHandlerMapping
  • BeanNameUrlHandlerMapping
  • SimpleUrlHandlerMapping
  • WelcomePageHandlerMapping
handlerAdapters:
  • RequestMappingHandlerAdapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter
viewResolvers:
  • ContentNegotiatingViewResolver
  • BeanNameViewResolver
  • ViewResolverComposite
  • InternalResourceViewResolver
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值