SpringMVC处理流程

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值