springmvc源码解读(简介)
源码简介:首先,我们先从 DispatcherServlet 中找到获取 handler 的方法
然后进入这个方法,这个方法最终可以返回 Handler 或者 null ,返回的类型是 HandlerExecutionChain (返回的不是handler的类型,而是一个执行链)
首先判断 handlerMappings 是否不为空,如果成立了,就进入while循环,那么handlerMappings 是什么东西呢?我们来开启DeBug来看一下
那么应该在哪里加断点呢?我们应该在核心的方法 doDispatch( ) 这里加。
然后走到获取Handler的方法,进入getHandler()方法
可以看出,handlerMappings是一个集合,集合里面还有两个对象,这两个对象是用来跟handler来进行匹配的
进入下一步,我们可以看到 mapping :BeanNameUrlHandlerMapping,在集合中我们也可以看到有一个BeanNameUrlHandlerMapping对象,然后进入 if 语句 ,handler不为空,跳出循环,返回handler
返回的handler,到getHandler方法
说了这么多,那么handlerMappings这个集合里面的两个对象到底是什么呢?我们再走下一步,进入 if 语句,我们看输出台上的mappingHandler,里面存了一个对象,内容里面有一个我们自己写的控制器,和一个拦截器
它将我们的控制器和拦截器封装成一个HandlerExecutionChain , 拦截器是spring系统自己定义的,每次执行的时候都会自带一个拦截器。
找到handler后,返回到中央控制器DispatcherServlet,中央控制器又拿着handler去请求handlerAdapter处理适配器,为什么需要适配器呢?我们带着这个疑问来看一下,跟获取handler的方法一样,找到获取适配器的方法
进入方法,这个方法藏得比较深,我们要进入多次
继续进入该方法
再进入该方法
到了,该方法返回的类型是HandlerAdapter,这个方法跟getHandler方法差不多一样,也有一个handlerAdapter集合,集合里有3个适配器,打个比方,这三个适配器就相当于笔记本的电源充电线,不同的笔记本需要使用不同的适配器,不同的handler就要使用不同的handlerAdapter,通过循环,找到匹配的适配器。为什么一上来就有这三个适配器呢?其实这三个是系统提前定义好的
在我们的jar包中可以找到,前端控制器的配置文件,我们来进入配置文件,可以看到我们之前看到的handler和handlerAdapter中,两个集合的对象。
这样我们就知道为什么我们一进去就已经有东西了,原来是在这里提前加载了。
逻辑思维:
说直白一点,首先拿到handler的目的是为了拿到控制器,比如在我们的请求路径是 localhost:8080/test ,通过获得handler,返回我们定义的控制器和一个拦截器,找到我们写的代码,那么Adapter就是找出与让控制器执行的方法。
那么为什么要搞这么麻烦呢?是为了解耦、提高程序的灵活性。
拿到适配器之后,接下来我们继续走,途中经过方法请求方式的判断
当到了这一步,我们进去看一下applyPreHandler方法
这个方法是在我们的handler执行之前,拿到拦截器的数组,逐个执行拦截器
拦截器开启完成后,开始执行handler,最终返回mv,mv是我们的ModelAndView,我们进去看看
继续进去
再进去
到了,可以看出,最终执行handler方法,返回的是ModelAndView,将handler强制转换成Controller,这样就可以执行我们定义的控制器了。
最后总结一下:
第一个就是:从2个handler中,找合适的控制器
BeanNameUrlHandlerMapping@833153a, XML的配置方式控制器
RequestMappingHandlerMapping@3602f818 注解方式的控制器
第二个就是:从3个Adapter中,找合适的处理器
HttpRequestHandlerAdapter@28dc72d7, SimpleControllerHandlerAdapter@6b712691, XML的配置方式的Adapter、annotation
RequestMappingHandlerAdapter@4d763f47 注解方式的Adapter
springmvc源码解读(简介)的更多相关文章
- SpringMVC源码解读 - HandlerMapping
SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo
使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系
一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...
- SpringMVC源码解读 - RequestMapping注解实现解读
SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系 https://www.cnblogs.com/leftthen/p/520840 ...
- SpringMVC源码解读
1.SpringMVC简介 SpringMVC框架是围绕一个DispatherServlet来设计的.这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射.视图渲染.本地化.时区与主题 ...
- springMVC 源码解读系列(一)初始化
先看看DispatcherServlet的类机构: 初始化时序图: servlet初始化会调用 init 方法,换句话说就是springMVC进行初始化的时候首先会去执行HttpServletBean ...
- SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
摘要: SimpleUrlHandlerMapping只是参与Handler的注册,请求映射时由AbstractUrlHandlerMapping搞定. 初始化时,通过setMappings(Prop ...
- springMVC源码解读笔记
1: DispatcherServlet 的初始化流程(调用的init方法) a) 初始化spring高级容器,WebApplicationContext(容器初始化12个步骤) Servlet类的i ...
- SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping请求分发
AbstractHandlerMethodMapping实现接口getHandlerInternal,定义查找流程 RequestMappingInfoHandlerMapping根据RequestM ...
随机推荐
- Ubuntu/centos/redhat/SUSE sipp安装(带rtp支持,3.5.1版本)
1.ubuntu 12.04 apt-get install ncurses-dev apt-get install libpcap-dev ./configure --with-pcap make ...
- 基于【 Docker】一 || ElK安装部署使用教程
一.ELK介绍 1.ELK组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发 ...
- HTML中由于DIV(块元素)浮动,导致的父元素高度塌陷问题的解决方案
费话不多说,直接上问题: 1.开始时,页面只有两个DIV的嵌套(见图) 运行结果是: 现在看运行的是正常的,但是当我设置让 class="box2" 的DIV浮动时 运行结果是这样 ...
- 许愿墙JQ
<!doctype html> <html> <head> <meta charset="utf-8"> <t ...
- react快速上手一(使用js语法,创建虚拟DOM元素)
1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...
- JAVA栅栏和闭锁的区别
闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.即,一组线程等待某一事件发生,事件没有发生前,所有线程将阻塞等待:而事件发生后,所有线程将开始执行:闭锁最初 ...
- mysql 利用 case 批量更新
- gulp die('click').live('click' composer
gulp die('click').live('click' composer packagist.org https://getcomposer.org/ 下载后 php composer.pha ...
- 【3】Git命令
个人推荐的Git知识学习网站:https://git-scm.com . git常用操作图 init -> add -> commit -> remote -> push 初始 ...
- 基于docker搭建elasticsearch集群
es集群的搭建 - 基于单机搭建elasticsearch集群见官网 https://www.elastic.co/guide/en/elasticsearch/reference/current/d ...