一、DispatcherServlet初始化过程

下面看下FrameworkServlet这个类,FrameworkServlet继承自HttpServletBean。

首先来看下该类覆写的initServletBean方法:最后看下DispatcherServlet。

DispatcherServlet覆写了FrameworkServlet中的onRefresh方法:

始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

二、springmvc是如何找到controller

1.这个过程中重要的接口和类。

HandlerMethod类:

它的子类InvocableHandlerMethod有两个重要的属性WebDataBinderFactory和HandlerMethodArgumentResolverComposite, 很明显是对请求进行处理的。

InvocableHandlerMethod的子类ServletInvocableHandlerMethod有个重要的属性HandlerMethodReturnValueHandlerComposite,很明显是对响应进行处理的。

MethodParameter类:

HandlerMethod类中的parameters属性类型,是一个MethodParameter数组。MethodParameter是一个封装了方法参数具体信息的工具类,包括参数的的索引位置,类型,注解,参数名等信息。

HandlerMethod在实例化的时候,构造函数中会初始化这个数组,这时只初始化了部分数据,在HandlerAdapter对请求处理过程中会完善其他属性,之后交予合适的HandlerMethodArgumentResolver接口处理。

RequestCondition接口:RequestMappingInfo类:

2.Web服务器启动的时候,SpringMVC到底做了什么。

找对应关系

先看AbstractHandlerMethodMapping的initHandlerMethods方法中。

然后把对应关系放入到

我们知道,SpringMVC的分发器DispatcherServlet会根据浏览器的请求地址获得HandlerExecutionChain。

这个过程我们看是如何实现的。

首先看HandlerMethod的获得(直接看关键代码了):

HandlerExecutionChain里面有处理类。跟拦截器

三、详解springmvc中Controller方法中参数的工作原理

我们来看下SpringMVC中两个重要的接口。

两个接口分别对应请求方法参数的处理、响应返回值的处理,分别是

HandlerMethodArgumentResolverHandlerMethodReturnValueHandler

这两个接口都是Spring3.1版本之后加入的。

SpringMVC处理请求大致是这样的:

首先被DispatcherServlet截获,DispatcherServlet通过handlerMapping获得HandlerExecutionChain,然后获得HandlerAdapter。

HandlerAdapter在内部对于每个请求都会实例化一个ServletInvocableHandlerMethod进行处理ServletInvocableHandlerMethod在进行处理的时候,会分两部分别对请求跟响应进行处理

ServletInvocableHandlerMethod的returnValueHandlers和argumentResolvers这两个属性都是在ServletInvocableHandlerMethod进行实例化的时候被赋值的(使用RequestMappingHandlerAdapter的属性进行赋值)。

之后HandlerAdapter得到ModelAndView,然后做相应的处理。

本文将重点介绍ServletInvocableHandlerMethod对请求以及响应的处理。

步骤3.1开始处理

ServletInvocableHandlerMethod在这里进行初始化。

值是在spring生命周期初始化的

下面介绍下对ServletInvocableHandlerMethod的处理

1. 处理请求的时候,会根据ServletInvocableHandlerMethod的属性argumentResolvers进行处理,

2. 处理响应的时候,会根据ServletInvocableHandlerMethod的属性returnValueHandlers(自身属性)进行处理

ServletInvocableHandlerMethod的returnValueHandlers和argumentResolvers这两个属性都是在ServletInvocableHandlerMethod进行实例化的时候被赋值的(使用RequestMappingHandlerAdapter的属性进行赋值)。

results matching ""

    No results matching ""