springmvc的执行流程-源码分析(二)

上篇博客中介绍了springmvc的的初始化流程,相信大家对springmvc的源码部分有了更深一步的了解了,今天给大家分析一下springmvc的执行流程的源码,让大家进一步对springmvc了解的更加透彻一些.

在这里我使用的是spring-webmvc:5.1.8的jar包源码

在springmvc的执行流程中,doDispatch是最为核心的方法,所有的流程处理都将由这个方法来统筹.

当请求发送之后,会进入到doDispatch方法中,圈红圈的部分是重点大家主要关注红圈部分.首先会检查请求是否存在文件,然后调用getHandler()传入请求的request,getHandler方法就是去拿到处理器映射器和项目中的拦截器,返回一个处理器调用链HandlerExecutionChain,里面包括了处理器映射器,拦截器以及对应的controller方法.

大家可以看到handlerMappings有两个映射器,分别是RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,其中RequestMappingHandlerMapping是用于注解使用,BeanNameUrlHandlerMapping是用于XML的方式.如果该次请求是Controller类是基于注解的方式注入到ioc,就会去执行RequestMappingHandlerMapping的getHandler方法.

我们进入到getHandler方法中,代码第一步执行getHandlerInternal方法就是去根据请求的路径去拿到对应的Controller的Bean,以及Controller的对应的方法,大家可以看我用红圈圈出来的部分,最后调用getHandlerExecutionChain方法去获取到处理器执行链,并将拿到的HandlerMethod以及拦截器都封装到getHandlerExecutionChain类中.

拿到执行链以后就结束循环,将执行链返回.

接下来开始去执行第二步,去获取处理器适配器,获取处理器适配器的目的就是用来去执行请求的方法的.调用getHandlerAdapter(mappedHandler.getHandler())方法,传入我们在上一步获取到的HandlerMethod,也就是controller的实例以及请求对应的方法.

默认的适配器有三个,RequestMappingHnadlerAdapter,HttpRequestHadnlerAdpater,SimpleControllerHandlerAdapter三个,因为我们使用的是注解的方式,所以会获取到RequestMappingHnadlerAdapter.最后将其返回

然后第三步开始去执行拦截器的前置方法,所有的实现了springmvc拦截器接口的拦截器类的前置方法都将在此处去执行.

此处执行前置方法.

代码执行到此处开始进去重点了,ha.handle(processedRequest, response, mappedHandler.getHandler());处理器适配器开始去执行controller的方法了.

代码一直往里面走,.我们会进入到RequestMappingHnadlerAdapter适配器的handleInternal方法,会去调用invokeHandlerMethod方法

代码走到此处开始准备执行调用了

在这里调用方法,并获取到返回值,我们进一步下去看看.

第一步代码开始获取请求参数,下面使用doInvoke调用方法,我们进入到doInvoke方法去看看是如何调用的.

ReflectionUtils.makeAccessible(getBridgedMethod());这一步方法标识如果被调用的方法是私有的话会去使用反射强行破解.getBridgedMethod()方法就是获取到我们被执行的方法,然后再去使用反射机制去调用目标方法.执行完方法会去获取ModelAndView对象,因为我这里使用的是直接返回json,使用了RestController所以ModelAndView对象是为空

目标方法执行完了之后,开始执行拦截器的PostHandler方法.

最后这个方法是用来渲染视图的,拦截器的afterCompletion方法也是在里面进行调用的.

整个一个springmvc的执行流程大致就是如此了,相信大家看完之后有了一定的收获

下一篇博客给大家介绍springmvc是如何找到对应的controller的执行方法的源码分析.

发布了60 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42214548/article/details/103064078