基于springboot2的springmvc执行流程(二)
上一节中,我们分析了springmvc的大致执行流程,把DispatherServlet里面的整体流程都分析了一遍,doDispatch方法里面有一行代码是整个流程最核心的逻辑,如下图:
接下来我们进入到RequestMappingHandlerAdapter的handle方法进行源码分析:
首先会进入RequestMappingHandlerAdapter的父类handle方法,handle方法是handlerAdapter的定级接口的方法,所有子类都必须实现这个方法,这就是spring源码的扩展性的体现,这里你可以自己实现一个执行器。
真正执行handle逻辑的是handleInternal方法,这个方法在模板类中就是个没有实现的方法,是在RequestMappingHandlerAdapter中实现的,所以流程就又跳到了RequestMappingHandlerAdapter中,所以这个流程就是这样绕来绕去。
那么接下来我们就进入invokeHandlerMethod方法:
这个方法中没有太多与流程有关的逻辑代码,在
invocableMethod.invokeAndHandle(webRequest, mavContainer)
这行代码之前其实就做了一个事,就是把HandlerMethod对象里面的所有属性都赋值给新创建出来的ServletInvocableHandlerMethod对象,因为handlerMethod对象是一个公共的对象,这个请求拿到了,其他请求还要找它,所以就在本请求级别创建一个可执行的handlerMethod对象。再把argumentResolvers和returnValueHandlers两个属性也一起赋值给ServletInvocableHandlerMethod对象,这两个属性也是组合对象,一个是参数解析器,一个是返回值解析器,是后面分析流程的两个最核心对象。
接下来我们就进入ServletInvocableHandlerMethod对象的invokeAndHandle方法:
这个方法的主要代码我都写了注释,主要是两步骤:
1、执行请求的controller业务方法得到返回值
2、解析返回值
总结
本节我们分析了handlerAdapter执行的大致逻辑,总结起来就是五点:
1、把找到的handlerMethod对象里面的所有属性都赋值给新创建出来的ServletInvocableHandlerMethod
2、把参数解析器和返回值解析器从handlerAdapter里面的属性赋值给ServletInvocableHandlerMethod
3、执行ServletInvocableHandlerMethod的invokeAndHandle方法
4、执行请求得到返回值
5、解析返回值
下一节,我将分析
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
这行代码到底都做了哪些工作。