其实一年前就想系统地记录下本身阅读spring源码的收获,搞一个深刻浅出spring的系列文章,可是由于工做缘由,迟迟没有下笔。今天终于能够开始本身一年前的计划了,言归正传,首先开始spring mvc相关的内容。spring
文本主要从流程角度介绍spring mvc的整个工做原理,对spring mvc有一个总体的了解,具体实现细节不在本文的介绍范畴中。segmentfault
Spring MVC 是目前主流的Wew MVC框架之一。两个核心点:设计模式
如下分析基于spring 5.0.4
版本源码数据结构
DispatcherServlet
实现了Servlet
接口,整个请求处理流:HttpServlet.service -> FrameworkServlet.doGet -> FrameworkServlet.processRequest -> DispatcherServlet.doService -> DispatcherServlet.doDispatch
。 doDispatch(HttpServletRequest request, HttpServletResponse response)
方法即为整个spring mvc的处理流程。HandlerExecutionChain
(包含一个处理器 handler 如HandlerMethod 对象、多个 HandlerInterceptor 拦截器对象)。此处的handlerMappings列表为上下文中全部HandlerMapping接口的实现类(如图中列举了4个),遍历handlerMappings列表,针对每一个handlerMapping试图获取HandlerExecutionChain,一旦成功(不为null),即返回。这部分的详细分析见【深刻浅出spring】Spring MVC 流程解析 -- HanndlerMapping HanderAdapter.supports
判断是否支持。这部分的详细分析见【深刻浅出spring】Spring MVC 流程解析 -- HandlerAdapter ServletInvocableHandlerMethod
实例,核心方法invokeAndHandle
,包括输入参数的处理和返回数据的解析。这部分的详细分析见【深刻浅出spring】Spring MVC 流程解析 -- InvocableHandlerMethod DispatcherServlet
的ViewResolver列表,获取对应的View对象,入口方法DispatcherServlet.processDispatchResult
附上代码级的方法流,其中灰色标识主流程,绿色为DispathcerServlet.doDispatch
方法中的流程,红色为HandlerAdapter.handler
方法中的流程mvc