spring 中post请求的流转,主要涉及json转对象部分

246 阅读2分钟

当一个请求进来后,spring的最开头是从哪里来的,最后又从哪里出去的。之前都没有了解过,这次尝试了解下。

当一个请求进来后,最先进入到的是Dispatchservlet类中,执行其中的doService方法,

截屏2023-04-02 15.50.52.png

doService方法中主要查看doDispatch方法,这个主要是触发请求对应方法的处理。

Xnip2023-04-02_16-01-51.jpeg

其中getHandler会去获取对应的request对应的处理器,若获取不到会跳转到404的信息,

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

下面的getHandlerAdapter获取拦截器的信息。

image.png

第一部分会执行拦截器的preHandle部分,若有一个拦截器返回false,逆序执行已执行的拦截器的afterCompletion方法,若执行通过,则会调用对应的controller注解对应的方法,该部分内容采用的是反射执行。 执行hadle方法时,最终会找到RequestMappingHandlerAdapter类中的invokeHandlerMethod方法

image.png 看最后的invocableMethod.invokeAndHandle(webRequest, mavContainer)调用实现

image.png 继续往下寻找invokeForRequest的方法,

image.png 在往下查询getMethodArgmentValues方法实现,

image.png 至此,已经找到了如何将请求分表单数据转换成对应的实体对象,this.resolvers.resolveArgument方法回家数据内容进行json相关的解析,

image.png 方法内部中会寻找对应的数据类型转换器,

image.png 继续往下找,会找到readWithMessageConverters的重载方法,进入后会找到具体的实现逻辑,

image.png 该部分内容为具体的实现处理对应的数据的转换。

image.png 默认的消息转换器有如上的内容,

image.png 往下会走到对应json包的处理逻辑中,目前用的是jakson的处理逻辑,通过jackson的序列化内容,都可以查看databind包下的BeanDeserializer类中的 deserializeFromObject方法。

对象转换完成后,通过反射调用对应的方法,然后将返回的内容和视图进行绑定。最后执行拦截器的postHandle部分。至此一个post请求的进入和数据转换以及最后的出的基本流程就结束了。