一、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中两个重要的接口。
两个接口分别对应请求方法参数的处理、响应返回值的处理,分别是
HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler
这两个接口都是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的属性进行赋值)。