Spring MVC 源码跟踪

按照程序执行流程看下执行顺序
当我们发送一个请求的时候,最开始进入的是DispatcherServlet
我们来看下这个类:
在这里插入图片描述
查看这个类的引用后,会发现他就是一个标准的Servlet
然而Servlet的生命周期是:
init()——>service()——>distory()
最开始执行init()方法,下面来跟踪一下执行流程:
在DispatcherServlet父类FrameworkServlet类中没有发现init()方法,继续找父类,在HttpServletBean类中发现init()方法:
在这里插入图片描述
并且我们发现它是通过final修饰的,这说明什么,说明了到这重写完之后其它的子类不能去从写,也就是说不管写多少个子类最先走的一定是这个方法(不能被从写但是public是可以被集成的)。
在这个方法中,重点看一下这个方法initServletBean()初始化bean的方法:
在这里插入图片描述
如上图我们可以看到,它的子类是FrameworkServlet所以它走的就是FrameworkServlet这个类进入这个类的方法实现:
在这里插入图片描述
我们看initWebApplicationContext()方法把赋值给了一个全局变量:webApplicationContext(这个是属于spring)
接下来我们看看initWebApplicationContext()方法给我做了一个什么事情
在这里插入图片描述
rootContext获取到的Spring容器,空的mac对象被赋值SpringMVC容器
这里重要的一个操作红框框处就是设置父容器为Spring容器,这里说明了一个问题,Spring跟SpringMVC是父子关系也就是说spring包含了springMVC,也就是说明了SpringMVC容器可以调用Spring中所有的内容。
init()走完它的方法,实现的是初始化的是一个子容器。
在这里插入图片描述
这个方法里面是所以SpringMVC的所有组件:
常用的有一下几个:
initHandlerMappings()解析请求
initHandlerAdapters()调用方法
initViewResolvers()解析视图
initMultipartResolver()文件上传
initHandlerExceptionResolvers()异常映射
接着执行service(),跟踪看看:
发现DispatcherServlet里面没有发现service()方法,只有doService方法
在这里插入图片描述
然后我们查看它的父类FrameworkServlet里面有service()方法:
在这里插入图片描述
这里执行了获取请求的方法,放行请求,这里就是获取判断方法放行到DispatcherServlet 里的doService()在这个方法进行了参数的解析,然后放入到map集合里。
在这里插入图片描述
这里entry.getKey()获取到的就是web.xml配置的key=“demo”,这里会进行检查如果没有带"/“就会给它加上”/",也就是说"demo"="/demo"。
在这里插入图片描述
在这里插入图片描述
这里就把解析完成的路径跟需要调用的对象,保存在map集合中
在这里插入图片描述
handler强转成Controller,handleRequest()方法调用它的实现类,这样就结束了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章