springmvc源码分析----入门看springmvc的加载过程
接上一篇我们写的入门---http://www.cnblogs.com/duanxiaojun/p/6591448.html
今天从这个门里进去我们看springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的。
我知道在web.xml文件中我们是这样配置springmvc的:

我们的加载的入口就是dispatcherServlet。上一篇中我们说到了dispatcherServlet的集成关系,也反编译源码看到了具体的源码的截图。这里我们接着上篇中的集成关系说。在上篇说的httpServletBean的init()这个发放是final,也就是这个方法是不能被集成的,因此我们就可以断定spring在做这里的时候,也就是初始化的时候的入口就是init方法,这个入口是不能被子类去实现的。init方法中执行了如下的操作:

这里我们重点关注一下用黑线标注的initServletBean(),try语句块中的代码是做一些跟springmvc配置文件,以及资源文件相关的初始化工作,我们不做深入的研究,只需要知道相关的在web.xml文件中的配置相关的信息是在这里处理的,我们重点关注一下springmvc整体的初始化流程,让大家了解spring是如何加载的。好了我们看到initServletBean()
这时候我们发现在httpServletBean的这个类中有
这个方法,但是没有实现,而且是一个protocted修饰的方法,这也就是说这个需要子类去实现,好了我们顺着人家的代码进入freamWorkServlet中:

哟 还真是在这里,而且我们要关注一下 此时的initServletBean()方法又是一个呗final修改的方法,跟httpservletBean中的init()方法是一样的,效果作用也一样我们就不再赘述。这里我们进入该方法的具体实现。我们发现这个时候在整个的方法中最关键的就是initWebApplicationContext()这个方法,我们大家对applicationContext应该是比较熟悉的,因为spring的容器其实就是一个context。这时候才是真正的开始容器的初始化。好了我们进入initWebApplicationContext()这个方法:

在这个方法中代码的前两行,我们赢可以理解,因为springmvc的基于spring的,所以第一步是首先要去获取parent父容器也就是spring的容器。然后开始根据父容器开始创建springmvc的容器。这里我们再进入下一步之前 我觉着有必要对createWebApplicationContext(parent)这块做一个简答 的解释:

其实整个这个处理的效果或者用途就是用来将当前的springmvc的容器与他的父容器进行一个关联,比如wac.setParent(parent);wac.setServletContext(getServletContext());wac.setServletConfig(getServletConfig());wac.setNamespace(getNamespace());,最后将wac这个容器进行一个刷险。
容好了这里我们不多说哈,有时间的时候我们对springmvc容器与他的父容器spring容器的关系进行一个介绍。
接下来我们返回上一步,说到的对springmvc的容器和他的父容器进行一个关联之后进行下一步的操作。 onRefresh(wac);
在frameServlet中的initWebApplicationContext方法中的第三行代码就是这句,但是我们在frameWorkServlet中看到
同样是一个没有实现的方法,我们就应该可以推断的出来这个方法的具体实现应该交给他的子类去处理,这时候我们就要进入到他的子类dispatcherServlet中看到的是如下的实现:
哈哈,到这里我相信大家应该比较看着顺眼一些,这里才是我们再日常的开发中接触比较多的一些词或者类。我们看到在dispaerServlet中的onRefresh()方法中只有一个简单的initStrategies()方法,看到这个词Strategies,这是策略的意思,到这里了跟大家说一下,springmvc中使用到的设计模式----策略模式。好了进入initStrategies()方法后,如上图,这个时候springmvc就开始去加载对应的一些模块中主要的组件,比如initMultipartResolver用来springmvc处理文件的上传,initLocaleResolver(context)用来处理国际话语言相关的一些操作(反正到目前为止我没有接触到。。。。)initThemeResolver().这个是用来处理一些有关动态更换样式的支持(主题)。好像也没有使用过。。。initHandlerMappings()这个很重要处理我们经常听到的有关url和controller的映射关系,initHandlerAdapters()处理映射有关的适配相关。initHandlerExceptionResolvers(context);springmvc有关异常的处理。initRequestToViewNameTranslator(context)处理请求到视图名称的一个转换。initViewResolvers()处理视图。针对这几个策略今天就不细讲。下次我们重点讲各个策略在springmvc的初始化过程中是如何工作的。
对springmvc的整个的加载过程做一个简答的总结,再整个加载过程中httpServletBean是我们的入口,负责处理一些有关配置文件或者资源的准备,这是因为我们很多的bena有可能依赖这些资源,然后会开始servlet容器的创建工作从initServletBean()开始,这时候httpServletBean只是创建工作的入口,具体的创建是在他的子类frameWorkServlet中来做的,在frameWorkServlet中负责去跟父容器进行关联,并创建createWebApplicationContext。然后进入onRefresh()方法也就是他的子类dispaerServlet中取按照策略模式的方式对springmvc中的具体的每个模块进行初始化。所以子啊整个过程我们发现springmvc在做初始化的时候每个类所做的工作是不一样的,也是有分工的。httpservletBean主要是创建一些配置或资源文件,frameWorkServlet主要是创建容器以及跟父容器的关联。而在dispactorerServlet这个子类中才是真正的去做一些具体的初始化工作。
好了今天写到这里先,下次我要对DispatcherServlet中的每一种策略所做的事情进行一个介绍。然后对springmvc为什么这样安排也进行一个我自己的分析。不对的地方发夹可以指出来。我的只是一家之言。
springmvc源码分析----入门看springmvc的加载过程的更多相关文章
- springmvc源码分析——入门看springmvc的加载过程
本文将分析springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的. 我知道在web.xml文件中我们是这样配置springmvc的: 可以看到,springmvc的核心控制器就是Dis ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- SpringMVC源码分析6:SpringMVC的视图解析原理
title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...
- angular源码分析:angular的整个加载流程
在前面,我们讲了angular的目录结构.JQLite以及依赖注入的实现,在这一期中我们将重点分析angular的整个框架的加载流程. 一.从源代码的编译顺序开始 下面是我们在目录结构哪一期理出的an ...
- 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?
Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...
- laravel框架源码分析(一)自动加载
一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...
- Tomcat源码分析——SERVER.XML文件的加载与解析
前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...
- Tomcat源码分析——server.xml文件的加载
前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...
- SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet
转自:https://my.oschina.net/lichhao/blog SpringMVC简介 SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的 ...
随机推荐
- vue入门-常用指令操作
指令:v-xx组成的特殊指令,如果一个标签中有指令会默认替换原有的书 v-model:实现数据和视图的双向绑定 v-text:在元素中插入值 v-html:在元素中插入标签或者插入文本 v-if:根据 ...
- 不使用flash实现复制文字(图片)到剪贴板
<div>这里是待复制的文字或图片</div> var range = document.createRange(); var referenceNode = document ...
- 简单的HTML5音乐播放器(带歌词滚动)
// // 0) { this.lrcArr.push(item); } } frag = document.createDocumentFragment(); for(i = 0,len = t ...
- disabled和readonly
项目中,有一个input控件,input的值需要通过点击一个javascript链接,从弹出的对话框中所列出的项中选择.而不能从input框中直接输入. 刚开始将input的disabled属性设置为 ...
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- android开发——自己定义相机(Camera)开发总结
近期这段时间我一直在开发自己定义相机.谷歌了些网上的demo.发现有非常多各种各样的问题.终于还是从API的camera类開始学习,进行改进. 以下对之前的实现进行一些总结. 官方camera API ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- c# winform中预防窗体重复打开
当窗体以非模态形式打开的时候,有可能出现重复打开的情形,利用以下的代码可以预防重复打开! foreach (Form f in Application.OpenForms) { if (f.Nam ...
- 《打造Facebook》
王淮的<打造Facebook>一书不厚,花半天时间轻松读完.书中没有大段的说教,只有近乎流水的陈述.正如作者所说,打造Facebook这本书由巴克伯格来写再合适不过.可惜他至少在近几年内没 ...
- 事件 MotionEvent
点击和长按可能会同时发生,需要在长按的回调函数中返回true,就不会产生点击.谁处理事件谁就是消费者 如果view组件不处理事件,最后会让ontouchevent处理,它是备胎 <LinearL ...