doDispatch()
getHandler()
遍历已经注册的handlerMapping,调用mapping的getHandler方法
getHandlerInternal,AbstactHandlerMethodMapping::getHandlerInternal()获取HandlerMethod。然后调用getHandlerExecutionChain()获取HandlerExecutionChain对象。
getHandlerAdapter()获取适配器。获取完适配器,调用applyPreHandle,调用interceptor的preHandle()处理。然后调用adapter的handle方法()。然后调用applyPostHandle()处理。
如果是@ResponseBody注解则mv为null,然后通过processDispatchResult处理ModelAndView,使用render()渲染。
AbstractHandlerMethodMapping::getHandlerInternal()
通过UrlPathHelper::getLookUpForRequest()获取请求的路径,内部通过getRequestUri获取路径,然后通过lookHandlerMethod,从mappingRegistry中获取直接匹配路径,然后会对匹配的路径进行排序,将最符合的路径对应的HandlerMethod返回,然后调用createWithResolvebleBean,因为HandlerMethod里this.bean记录的是Controller的name,因此在包装成HandlerMethod之前需要调用beanFactory的getBean获取Bean实例。
getHandlerExecutionChain
遍历adaptedInterceptors,判断是否为MappedInterceptor,如果是则调用matches判断是否匹配路径,如果不是MappedInterceptor,直接加入chain。
常见的的Interceptor有ConversionServiceExposingInterceptor,用来请求数据类型转换。
getHandlerAdapter
遍历handlerAdapters,调用support选择适配器,原理是判断是否为特定类,比如RequestMappingHandlerAdapter是判断是否是HandlerMethod对象。
handle()
handleInternal(),内部调用invokeHandlerMethod(),在里面创建ModelAndView容器之后,调用invokeAndHandle,然后调用invokeForRequest,最终调用doInvoke,里面通过之前找到的HandlerMethod,找到真实的方法然后invoke获取值,然后通过returnValueHandlers的handleRetrunValue处理返回值。其内部通过supportsReturnType方法获取handler,原理是判断返回值类型是否为特定的类或者子类,亦或者是特定注解比如@ResponseBody。
在处理完成后返回ModelAndView。