该文章展示了用debug获取的一个请求到来时的调用栈,解释了Spring请求-响应过程的主要类和方法
阅读源码,主要还是需要知道核心方法和调用逻辑,debug是了解一个方法调用时发生了什么的关键。下面我们通过debug了解Spring收到一个普通请求时的调用过程:
请求到来时的调用栈:
相关类及其核心方法:
DispatcherServlet.doDispatch
包含拦截器、Handler、视图渲染等活动调用逻辑
AbstractHandlerMethodAdapter.handle
主要进行handler(一般就是定义的Controller中的一个RequestMapping映射)方法调用
RequestMappingHandlerAdapter.handleInternal --> invokeHandlerMethod
ServletInvokableHandlerMethod.invokeAndHandler
包含请求处理方法调用和返回值的处理调用逻辑
InvocableHandlerMethod.invokeForRequest
进行映射方法参数的解析和映射方法调用的主要逻辑
HandlerMethodArgumentResolverComposite.resolveArgument
进行方法参数的解析
|
—RequestResponseBodyMethodProcessor.readWithMessageConverters
| 进行包含@RequestBody参数的类型转换
|
—AbstracrtNamedValueMethodArgumentResolver
| 进行@CookieValue、@RequestParam、@HttpHeader等注解的参数的解析
|
—RequestPartMethodArgumentResolver
对@RequestPart注解参数进行解析
处理返回值调用栈:
相关类和核心方法:
HandlerMethodReturnValueHandlerComposite.handleReturnValue
RequestResponseBodyMethodProcessor.handleReturnValue
AbstreactMessageConverterMethodProcessor.writeWithMessageConverters
对返回参数进行格式转换的主要逻辑,根据RequestMapping中设置的produces进行转换
总结一下这里主要涉及的处理类后缀以及意义:
Composite:设计模式 – 组合模式应用,主要把所有实现相同接口的类组合在一起,统一处理过程,这种类里主要包含对处理器的选择过程。比如HandlerMethodReturnValueHandlerComposite、HandlerMethodArgumentResolverComposite等。
HandlerExecutionChain:进行调用链的调用
HandlerAdapter:执行方法
MethodArgumentResolver:方法参数解析器。
MethodProcessor:对方法的返回值和入参进行处理。
MessageConverter:主要进行格式转换以及编码,比如json、xml等。
– 写于Evernote 2019/8/3 15:09