IT我爱编程

SpringMVC DispatcherServlet源码学习

2018-06-11  本文已影响21人  6c6e0f90df6b

Spring MVC的请求调度器:DispatcherServlet。

以下用一个例子来说明调用流程, 环境:spring-boot-starter-web:1.4.0.RELEASE

注:该图是SpringMVC匹配控制器Controller,获取控制器返回页面View和Model。

流程说明如下


1、在第一个请求发送给DispatchServlet进行调度之前,容器会先对DispatchServlet进行初使化过程,而DispatcherServlet继承了抽象类FrameworkServlet,FrameworkServlet继承自HttpServletBean。在初使化时会分别调用了父类的相应方法,

(1)HttpServletBean 属性初使化 init:set bean properties

HttpServletBean init

(2)FrameworkServlet ServletBean初使化

包括两部分 initWebApplicationContext应用上下文和initFrameworkServlet,其中在初使化WebApplicationContext时会使用ApplicationContext来刷新DispatcherServlet(onRefresh方法)

initWebApplicationContext onRefresh

(a)initMultipartResolver

(b)initLocaleResolver

(c)initThemeResolver

(d)HandlerMapping:DispatchServlet ->onRefresh->initStrategies->initHandlerMappings

HandlerMapping 处理器作用是匹配controller,带优先级处理

在进行initHandlerMappings后会将框架默认handler存放在ListhandlerMappings中,包括ResourceHttpRequestHandler、RequestMappingHandlerMapping、BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping、WebMvcConfigurationSupport$EmptyHandlerMapping。

其中RequestMappingHandlerMapping对象用于匹配Controller控制器,ResourceHttpRequestHandler用于匹配资源对象,如页面,css, js。

  (e) initHandlerAdapters

(f) initHandlerExceptionResolver

  (g) initRequestToViewNameTranslator

(h) initViewResolvers

(i) initSessionFlashMapManager


2、初使化完成,请求正式进入DispatchServlet的doDispatch方法进行调度,在进行调度时,需要获取该请求对应的mappedHandler和HandlerAdapter,并对请求进行mappedHandler 的applyPreHandle拦截。

3、通过HandlerAdapter的handle方法获取到Controller,执行业务流程

4、获取Controller执行后创建的ModelAndView,设置默认ViewName,进行mappedHandler的applyPostHandle拦截

6、对Controller返回的结果进行处理,ViewResolver视图解析器解析对应的页面名称,获取对应的View

7、这里还会进行Model的处理,将Model保存到request的Attribute中

8、调用上面获取到的View的forward或redirect方法响应给浏览器

9、浏览器接收到响应,重新发起了资源页面请求,请求再次经过DispatchServlet,通过获取对应的资源mappedHandler处理该次请求。

二、dispatchservlet的调度流程再进行细分

(1)调用过滤链ApplicationFilterChain

(2)设置request的Attribute

  (3)  dispatchservlet doDispatch

3、dispatchservlet doDispatch

(1) handle multipart request

(2) get mappedHandler

(3) getHandlerAdapter

(4) checkLastModified

(5) mappedHandler.applyPreHandle

(6) actually invoke the handler

(7) asyncManager.isConcurrentHandlingStarted

(8) mappedHandler.applyPostHandle

(9) applyDefaultViewName

(10) processDispatchResult

问题1、springMVC是怎么匹配到相应控制器方法的

根据path匹配相应的HandleMapping,从RequestMappingHandlerMapping的MappingRegistry控制器集合中找到相应的Controller。

路径:DispatchServlet->HandleMapping->RequestMappingHandlerMapping->MappingRegistry->HandlerMethod->Controller。

问题2、springMVC是怎么将对象自动转json的

使用@ResponseBody注解

DispatchServlet->RequestMappingHandlerMapping->RequestMappingHandlerAdapter->ServletInvocableHandlerMethod->InvocableHandlerMethod->HandlerMethodArgumentResolverComposite->RequestResponseBodyMethodProcessor

上一篇 下一篇

猜你喜欢

热点阅读