接上一篇我们写的入门---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的加载过程的更多相关文章

  1. springmvc源码分析——入门看springmvc的加载过程

    本文将分析springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的. 我知道在web.xml文件中我们是这样配置springmvc的: 可以看到,springmvc的核心控制器就是Dis ...

  2. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  3. SpringMVC源码分析6:SpringMVC的视图解析原理

    title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...

  4. angular源码分析:angular的整个加载流程

    在前面,我们讲了angular的目录结构.JQLite以及依赖注入的实现,在这一期中我们将重点分析angular的整个框架的加载流程. 一.从源代码的编译顺序开始 下面是我们在目录结构哪一期理出的an ...

  5. 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?

    Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...

  6. laravel框架源码分析(一)自动加载

    一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...

  7. Tomcat源码分析——SERVER.XML文件的加载与解析

    前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...

  8. Tomcat源码分析——server.xml文件的加载

    前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...

  9. SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet

    转自:https://my.oschina.net/lichhao/blog SpringMVC简介 SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的 ...

随机推荐

  1. Linux基础(4)-硬盘分区、格式化及文件系统的管理、软件包的管理、yum管理RPM包和python的源码安装

    一: 1)  开启Linux系统前添加一块大小为15G的SCSI硬盘 2)  开启系统,右击桌面,打开终端 3)  为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑 ...

  2. 安卓UI适配限定符

    引言 对于程序在不同尺寸的Android机器上执行,对UI的适用性造成了额外的开销,只是限定符的出现,非常方便的攻克了这个问题.通过创建限定符相关的文件夹来解决资源的载入. 限定符用处 限定符(mdp ...

  3. 服务管理-DHCP、NTP、SSH

    DHCP协议的作用及原理 1.寻找server 当DHCP客户端第一次登陆网络的时候,也就是客户发现本机上没有任何ip资料设定,他会向网路发送一个dhcpdiscover封包.因为客户端还不知道自己属 ...

  4. 系统安全-LDAP

    LDAP服务器 1.目录服务  目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...

  5. unittest相关文档

    文档链接: http://blog.csdn.net/wangst4321/article/details/8454118

  6. asyncio协程与并发

    并发编程 Python的并发实现有三种方法. 多线程 多进程 协程(生成器) 基本概念 串行:同时只能执行单个任务 并行:同时执行多个任务 在Python中,虽然严格说来多线程与协程都是串行的,但其效 ...

  7. Android: 亲測解决模拟器启动慢的问题

    1.首先在相应的sdk manager里面下载一个4.03以上的api. 这里我选择的是4.2.2 (api17) 2.选择里面的" Intel Hardware Accelerated E ...

  8. 通过css选择器class给元素添加cursor的坑

    笔者在chrome中遇到了奇特的问题,在通过class给元素添加cursor的自定义图片时.出现了"Invald property value"提示,crosshair.help等 ...

  9. a REST API

    https://spring.io/guides/tutorials/bookmarks/ http://roy.gbiv.com/untangled/2008/rest-apis-must-be-h ...

  10. VB.Command()的参数

    VB.Command()的参数的来源有三个地方 1配置文件2启动参数3框架