调戏源码之Spring MVC(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guitarrain/article/details/77920773

调戏源码之Spring MVC(一)

  • 何为调戏
  • SpringMVC流程图
  • 入口在哪?
  • 流程详解

一直以来都觉得源码是非常神秘的,直到最近找工作,看了一下SpringMVC源码,发现并没有想象中那么困难!但在面试时却不能清晰流畅的表达给面试官.
想起了之前看过的刘未鹏的一片文章:为什么你应该(从现在开始就)写博客 ,于是决定梳理下.


何为调戏

取这个名字有两层含义:

  1. 态度
    源代码解析,深入理解xx源代码,甚至死磕xx源代码.这些名字听起来是非常痛苦的.为什么就不能调戏一下呢?把源码当作一个很好玩儿,很有趣的姑娘,我们来逗逗她不好吗?抱着这样的态度去研究源代码是不是轻松很多呢?不要给自己设置心理上的障碍!
  2. 目的
    从字面理解,”调戏”就是通过DeBug调试跟踪源代码,达到玩转源码,手写SpringMVC的目的.

SpringMVC流程图

这里写图片描述

网上类似的流程图有很多,在最后一步大多是从DisPatcherServlet指向用户作为响应.我将其改成从视图指向用户更为直观也便于理解.

入口在哪?

doDisPatch 是如何调用的:

这里写图片描述
从DisPatcherServlet的继承体系可以看到SpringMVC是基于Servlet的.

这里写图片描述
看图吧!文字叙述太啰嗦!
总之切入点就是父类service方法,最终来到DisPatcherServlet的doDisPatch方法.

在web.xml中配置了DisPatcherServlet后用户的请求就能够被拦截
这里写图片描述

接下来就按照上述时序图的流程找到doDisPatch方法执行.而该方法所做的事情就是文章头部SpringMvc流程图的内容.

流程详解

1.处理器映射器 在doDisPatch方法第一行打断点DeBug运行:
这里写图片描述
红框中的注释已经说的很清楚了:”确定当前请求对应的处理器“,跟踪getHandler方法来到这里:
这里写图片描述
继续跟踪HandlerMapping的getHandler方法
这里写图片描述
在这里持续按F6,直到第二次for循环才进入循环体,此时的HandlerMapping是DefaultAnnotationHandlerMapping,而我是通过@RequestMapping注解的方式使用SpringMVC的.
猜想BeanNameUrlHandlerMapping可能用于bean配置方式来拦截Url获取Handler.
这里写图片描述
由于是注解方式开发,getHandlerInternal方法的返回值是null,直接返回getHandlerExecutionChain(handler,request).
至此第一步已经完成了,DisPatcherServlet得到一个包含了拦截器和处理器的HandlerExecutionChain对象.

2.处理器适配器
接下来要讲的流程第二步,全部围绕这句代码展开:
这里写图片描述
此处的ha是调用DisPatcherServlet的getHandlerAdapter方法得到的.ha调用handle方法获得ModelAndView:
这里写图片描述
请忽略这些if,else.我们直奔主题来到末尾return处,跟踪invokeHandlerMethod(request, response, handler)方法:
这里写图片描述
前几行都是辅助,红框部分才是主力输出.执行改行代码得到的result是这样的:
这里写图片描述
看到没?Model和View都有了.后两行代码都是善后,把result装换成ModelAndView对象并返回.
OK,流程图的第二部分也讲完了.到了这里一直以来心中的疑惑已经解开了(为什么SpringMVC拿到用户请求的Url后,能够根据@RequestMapping中的值找到正确的handler方法来执行?).
3.视图解析和渲染
在doDisPatch方法try部分的最后又这么一句:

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

这里就是视图的解析和渲染,让我们进去看下:
这里写图片描述
该方法再调用本类的render方法:
这里写图片描述
这里关键的两个地方已经标出来了,没错!他们分别对应解析和渲染这两步.至于详细情况大家自己DeBug去看吧!

猜你喜欢

转载自blog.csdn.net/guitarrain/article/details/77920773
今日推荐