一、概述
SpringMVC九大组件如下图,我将一个个进行介绍。各个组件使用的入口DispatcherServlet.doDispatch是各个组件使用的入口,我们大部分代码都是从这里开始进入的。
二、MultipartResolver
下面是MultipartResolver组件具体的使用流程,我们将一一介绍。
DispatcherServlet.checkMultipart是文件上传的入口。
点开该解析方法,会进入接口,但是我要看具体方法需要看实现的子类,那么要去看哪个子类呢?这时候注释的重要性就体现出来了。
注释里面明确给我们指示了这两个类是重要的实现子类,我们选择最上面的类进行具体的分析。
进入该类后parseRequest便是核心的处理方法。
ServletFileUpload.parseRequest方法,之后进入FileUploadBase.parseRequest具体解析了参数,并返回了结果。
CommonsFileUploadSupport.parseFileItems方法具体处理了结果并进行返回。
三、HandlerMapping
HandlerMapping使用的方法流程图如下图。它的大致处理逻辑是在Spring初始化的时候把处理器都放入DispatcherServlet.handlerMappings中,之后再遍历获取处理器。
通过DispatcherServlet.getHandler方法进入AbstractHandlerMapping.getHandler方法。
最后通过getHandlerInternal方法到具体的实现类中查看。
AbstractHandlerMethodMapping.getHandlerInternal调用的lookupHandlerMethod是具体的处理方法。
lookupHandlerMethod方法会根据初始化时存储的的路径去匹配对应的处理器。
具体的注册路径的方法来自于AbstractHandlerMethodMapping的内部类MappingRegistry的register方法。
四、HandlerAdapter
HandlerAdapter具体的请求处理流程如下,HandlerAdapter是具体处理的类,十分重要。
通过mv = ha.handle(processedRequest, response, mappedHandler.getHandler())这段代码,进入到AbstractHandlerMethodAdapter.handle方法。
最后进入RequestMappingHandlerAdapter.handleInternal进行具体处理。
invokeHandlerMethod方法进行了具体处理。
最后进入ServletInvocableHandlerMethod.invokeAndHandle方法。
最后进入InvocableHandlerMethod.invokeForRequest方法完成了最终方法的调用。
五、ViewResolver
ViewResolver的处理流程如下图。
先进入processDispatchResult方法
再通过render进行具体处理。
六、HandlerExceptionResolver
通过processDispatchResult方法进入processHandlerException进行异常的具体处理。
该方法进入具体的异常解析类进行异常处理。
七、ThemeResolver,LocaleResolver,RequestToViewNameTranslator,FlashMapManager
ThemeResolver,LocaleResolver,RequestToViewNameTranslator,FlashMapManager这四个组件再整个过程中,不起主要作用,因此不做重点介绍,大家可以自行学习。
八、总处理流程
参考文章:
【Spring】MVC:HandlerMapping 初始化及 handler 获取_槑!的博客-CSDN博客