栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC执行流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC执行流程

        SpringMVC是对servlet的一种封装,所以执行流程需要遵守servlet的声明周期,init、serivce、destory

        1、当请求到达时首先要进入到frameworkServlet的service方法中,随后会通过tomcat的源码的解析执行对应的doGet、doPost、doPut等操作。

        2、最终都会调用一个processRequest的方法,这个方法中有一些列的设置操作。

        3、随后调用doService方法,此方法在DispatcherServlet中,为request对象设置一些springmvc的内置组件。

        4、随后调用核心方法doDispatch此方法在DispatcherServlet中。

        4-1:首先校验是否是上传的请求,主要判断请求中是否有multipart/开头的属性。如果是解析文件等信息放入request中。

        4-2:调用getHanler方法,获取处理器,这里面主要两个默认的类中的变量进行识别。

                4-2-1:RequestMappingHandlerMapping,最终会将所有的@RequestMapping修饰的方法放入到MappingLookUp变量中,此变量中的值是在doCreateBean方法中的InitializeBean方法中的实现了initialztionBean类重写了afterProperiesSet方法中进行赋值的。

                4-2-2:BeanNameUrlHandlerMapping,最终会将配置文件中以/开头的bean加入到handlerMap变量中,此变量中的值是在doCreateBean方法中的InitializeBean方法中的BeanPostProcessorBefore方法中的通过实现了ApplicationContextAware接口从而调用setApplicationContext方法经过一系列操作进行赋值的。

        此方法还会获取的我们系统定义的拦截器,如果没有定义会初始化两个默认的拦截,最后封装到一个HandlerExecutionChain的类中进行返回。

        4-3:调用getHandlerAdapter方法获取合适的适配器,这里有三个默认的适配器来对我们的handler进行匹配。

                4-3-1:RequestMappingHandlerAdapter:适配@controller注解修饰的类,最经常用的。因为方法名是我们自定义的所以会发生一些列很复杂的操作,下面会说。

                4-3-2:HttpRequestHandlerAdapter:适配实现了HttpRequestHandler接口的方法,直接重写其中的handlerRequest方法即可调用。

                4-3-3:SimpleControllerHandlerAdapter:适配实现了Controller接口的方法,直接重写其中的handlerRequest方法即可调用。

        4-4:进行拦截器的前置处理方法,这块有一个好玩的地方,就是拦截器前置处理方法如果发生了异常,那么会把已经执行过拦截器前置处理方法的拦截器反向执行器后置处理方法。

        4-5:如果是get请求,调用getLastModified方法,静态资源缓存作用。

        4-6:核心方法来了奥,调用ha.hanler方法,是通过4-3获取的适配器进行调用,如果是4-3-2和4-3-3的是配置直接调用重写的handlerRequest方法即可。如果是RequestMappingHandlerAdapter方法那么好玩的就来了。这块会有很大的篇幅来说这个里面的处理逻辑。

                4-6-1:调用handlerInternal方法。

                4-6-2:随后调用invokeHandlerMethod方法。此方法中有一些获取封装操作。

                        4-6-2-1:首先封装request和response到一个ServletWebRequest的对象中。

                        4-6-2-2:获取当前类中@InitBinder修饰的方法,以及通过@ControllerAdvice修饰的类中@InitBinder修饰的方法封装到WebDataBinderFactory对象中。

                        4-6-2-3:获取被@ModalAttribute修饰并且没被@RequestMapping修饰的方法放到ModelFactory对象中。

                        4-6-2-4:实例化ServletInvocableHandlerMethod类将handlerMethod放入,此类是调用后续真正方法的类。实例化后开始进行赋值,默认的26个参数处理器,默认的15个返回值处理器,2-6-2-2的对象,默认的2个参数名称发现器。

                        4-6-2-5:实例化ModelAndViewContainer对象进行赋值flashMap等。

                        4-6-2-6:初始化异步处理器并且赋值WebAsyncManager。

                        4-6-2-7:调用invokeAndHandler方法准备处理请求。

                                4-7-2-7-1:调用inokeForRequest方法。

                                        4-7-2-7-1-1:调用getMethodArgementValues解析请求参数。次数用到了默认的26个参数值处理器循环进行匹配验证

                                        4-7-2-7-1-2:doInvoke方法,获取桥接调用我们的方法。

                                4-7-2-7-2:成功调用后设置响应状态,使用默认的15个返回值处理器进行返回值匹配,通过mavContainer渲染视图或返回json等。

注:如果发生异常需要调用默认的3个异常处理器,ExceptionHandlerExceptionResolver:处理被@ExceptionHandler修饰的方法进行匹配、DefaultExceptionHandlerResolver:处理定了了一堆默认的异常进行匹配、ResponseStatusExceptionResolver:处理了被@ResponseStatus注解修的方法进行匹配。寻找到对应的方法继续调用InvokeHandlerMethod方法同前面调用。

以上为基于个人理解进行纯手敲,每一个字母都是背下来手敲的,附上一张自己画的图。

springmvc执行流程图

理解之上,写出想要说的话!

以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!

                 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462162.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号