今天从这个门里进去我们看springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的。

我知道在web.xml文件中我们是这样配置springmvc的:

springmvc初始加载一些数据 springmvc加载流程_spring

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

springmvc初始加载一些数据 springmvc加载流程_springmvc初始加载一些数据_02

这里我们重点关注一下用黑线标注的initServletBean(),try语句块中的代码是做一些跟springmvc配置文件,以及资源文件相关的初始化工作,我们不做深入的研究,只需要知道相关的在web.xml文件中的配置相关的信息是在这里处理的,我们重点关注一下springmvc整体的初始化流程,让大家了解spring是如何加载的。好了我们看到initServletBean()

这时候我们发现在httpServletBean的这个类中有

springmvc初始加载一些数据 springmvc加载流程_springmvc初始加载一些数据_03

这个方法,但是没有实现,而且是一个protocted修饰的方法,这也就是说这个需要子类去实现,好了我们顺着人家的代码进入freamWorkServlet中:

springmvc初始加载一些数据 springmvc加载流程_spring_04

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

springmvc初始加载一些数据 springmvc加载流程_初始化_05

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

springmvc初始加载一些数据 springmvc加载流程_初始化_06

其实整个这个处理的效果或者用途就是用来将当前的springmvc的容器与他的父容器进行一个关联,比如wac.setParent(parent);wac.setServletContext(getServletContext());wac.setServletConfig(getServletConfig());wac.setNamespace(getNamespace());,最后将wac这个容器进行一个刷险。

容好了这里我们不多说哈,有时间的时候我们对springmvc容器与他的父容器spring容器的关系进行一个介绍。

接下来我们返回上一步,说到的对springmvc的容器和他的父容器进行一个关联之后进行下一步的操作。 onRefresh(wac);

springmvc初始加载一些数据 springmvc加载流程_springmvc初始加载一些数据_07

在frameServlet中的initWebApplicationContext方法中的第三行代码就是这句,但是我们在frameWorkServlet中看到

springmvc初始加载一些数据 springmvc加载流程_初始化_08

同样是一个没有实现的方法,我们就应该可以推断的出来这个方法的具体实现应该交给他的子类去处理,这时候我们就要进入到他的子类dispatcherServlet中看到的是如下的实现:

springmvc初始加载一些数据 springmvc加载流程_mvc_09

哈哈,到这里我相信大家应该比较看着顺眼一些,这里才是我们再日常的开发中接触比较多的一些词或者类。我们看到在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为什么这样安排也进行一个我自己的分析。不对的地方发夹可以指出来。我的只是一家之言。