org.springframework.web.servlet.DispatcherServlet#doDispatch
>org.springframework.web.servlet.DispatcherServlet#getHandler获取HandlerExecutionChain执行类(处理程序执行链,由处理程序对象和任何处理程序拦截器组成)
>org.springframework.web.servlet.DispatcherServlet#getHandlerAdapter获取handlerAdapter(MVC framework SPI, allowing parameterization of the core MVC workflow.)
>org.springframework.web.servlet.HandlerAdapter#handle执行handle,mvc处理的核心流程,包括request封装,注解解析,参数解析,controller执行,返回值处理
>org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter#handleInternal
>org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal
>org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandleMethod
>org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
>org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest处理请求
>org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues参数处理
>org.springframework.web.method.support.InvocableHandlerMethod#doInvoke执行真正的controller
》org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue返回值处理
参数处理流程
org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest
》org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues查找并组装参数
》org.springframework.web.method.support.InvocableHandlerMethod#resolveProvidedArgument处理参数值
》org.springframework.web.method.support.HandlerMethodArgumentResolverComposite#supportsParameter查找参数处理器中的一个方法,通过组合模式实现,最终实现是循环去调用org.springframework.web.method.support.HandlerMethodArgumentResolver的实现类的supportsParameter方法,找到则跳出循环,直接调用它的resolveArgument方法,HandlerMethodArgumentResolver这个接口的实现类很多,其实简单的说是按照controller里的注解配置决定的,对于不同的注解实现类不一样,比如@PathVariable注解处理类是org.springframework.web.servlet.mvc.method.annotation.PathVariableMapMethodArgumentResolver,@RequestBody注解的实现处理类是org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor,@RequestParam注解的处理器是org.springframework.web.method.annotation.RequestParamMethodArgumentResolver,还有些基础类型的如String,Integer等没有被注解修饰的默认也是org.springframework.web.method.annotation.RequestParamMethodArgumentResolver处理的
返回值处理:
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
》org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#selectHandler查找返回值处理器
》org.springframework.web.method.support.HandlerMethodReturnValueHandler#handleReturnValue真正处理返回值,处理是根据controller里面配置的返回值的类型去处理的,其实是调用org.springframework.web.method.support.HandlerMethodReturnValueHandler接口的supportsReturnType来确定的,如果返回的是view则处理类是org.springframework.web.servlet.mvc.method.annotation.ModelAndViewResolverMethodReturnValueHandler;
如果controller中配置的是@ResponseBody,则处理类是org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
如果返回map则处理类是org.springframework.web.method.annotation.MapMethodProcessor
还有好多各种处理器;