`

Spring Mvc——初始化

阅读更多

原创内容,转载请注明出处

1、概述

Spring mvc的初始化主要包括根IOC容器的构建和初始化、DispacherServlet的构建和初始化(初始化包括Spring mvc IOC容器的构建和初始化)。根IOC容器指的是Spring的IOC容器,其对应配置文件是web.xml配置文件下的contextConfigLocation参数,也就是Spring的配置文件,即上例的spring.xml文件,该容器的构建和初始化实现在ContextLoaderListener监听器完成。Spring mvc IOC容器是根容器的一个子IOC容器,其配置文件是DispatcherServlet配置节点下contextConfigLocation参数,即上例的spring-mvc.xml。

 

2、ContextLoaderListener初始化监听



 

如上类图可以看出ContextLoaderListener类实现了ServletContextLisener接口和继承了ContextLoader,主要职责是监听ServletContext实例的创建和销毁(对应监听器方法是contextInitialized和contextDestroyed方法)。

 

1.在contextInitialized监听方法,ContextLoaderListener调用了父类ContextLoader的initWebApplicationContext方法去初始化构建WebApplicationContext容器。

 

2.在ContextLoader的initWebApplicationContext方法中,首先调用createWebApplicationContext方法去实例化一个WebApplicationConntext对象,该对象实际是XmlWebApplicationContext(WebApplicationContext的实现子类)实例,并且是Spring web 容器的一个根IOC容器。在Spring IOC容器中,Spring IOC容器是一个树状结构,允许有子IOC容器(注:在这里spring的IOC容器是根容器,后面讲到Spring mvc的IOC容器就是其子IOC容器)

 

3.初始化IOC容器configureAndRefreshWebApplicationContext方法。在这里首先会获取web.xml配置中的contextConfigLocation参数值(即Spring配置文件路径),并将路径传给根IOC容器。如果没有配置,则默认使用去/WEB-INF/applicationContext.xml路径。最后调用根IOC容器的refresh的方法,该方法由父类AbstractApplicationContext实现,因此其刷新容器和FileSystemXmlApplicationContext初始化IOC容器一样,也是调用父类AbstractApplicationContext的refresh方法完成。

 

4.之后将根IOC容器对象设入ServletContext对象中缓存起来,以方便后续获取。

 

3、DispatcherServlet初始化

3.1、DispatcherServlet初始化参数配置说明

contextClass 定义DispatcherServlet类构建的WebApplicationContext实例类,用户可自定义类去实现WebApplicationContext接口。默认使用XmlWebApplicationContext类
contextConfigLocation 定义DispatcherServlet类的IOC容器(即contextClass实例)的配置文件。由于spring支持多配置文件,故而在此处可填写多个配置文件路径(按逗号分隔)。如果同一个bean在多个配置文件中都被定义,则以最后一个为准。
namespace DispatcherServlet的IOC容器的命名空间,默认使用[servlet-name]-servlet

 

 

3.2、DispatcherServlet初始化



 如上类图可以看出DispacherServlet类是HttpServlet的子类,它包含了关于HttpServlet的所有功能,初始化、处理请求和Servlet容器销毁。容器初始化init方法被DispacherServlet的父类HttpServletBean重写处理,因此Srping mvc的初始化入口在HttpServletBean类的init方法上。

 

1.进入HttpservletBean的init方法,在该方法中首先将DispatcherServlet对象包装成一个BeanWrapper实例。

2.将ServletConfig的参数(即web.xml文件中Servlet的配置参数)置入ServletConfigPropertyValues对象。

3.通过ServletContext实例构建ServletContextResourceLoader实例。

4.最后将ServletConfigPropertyValues实例和ServletContextResourceLoader实例设入装有DispatcherServlet的BeanWrapper对象中。

5.之后调用initServletBean方法来初始化DispatcherServlet实例,该方法由子类FrameworkServlet实现,在该方法中调用initWebApplicationContext方法。initWebApplicationContext方法主要是构建和初始化Spring mvc的IOC容器。

 

6.在initWebApplicationContext方法中,首先从ServletContext获取根IOC容器,即前面ContextLoaderListener构建的根IOC容器实例。然后在ServletContext中获取Spring mvc IOC容器,如果没有,则调用createWebApplicationContext(rootContext)方法去创建和初始化IOC容器。

 

7.在createWebApplicationContext方法中,和根IOC容器的创建过程基本一致。首先创建Spring mvc IOC容器,该容器也是XmlWebApplicationContext类的实例;然后为容器设置父IOC容器,即根IOC容器;之后设置该容器配置文件的路径(web.xml文件中的配置DispatcherServlet类节点下的contextConfigLocation参数值,如果没有配置该参数值,默认使用/WEB-INF/DispatcherServlet配置的名字-servlet.xml),最后调用configureAndRefreshWebRefreshWebApplicationContext方法去配置和刷新IOC容器。

 

8.在configureAndRefreshWebRefreshWebApplicationContext方法中,主要负责配置并且刷新IOC容器,首先为IOC容器设置ServletContext、ServletConfig等属性对象,并为IOC容器注册上下文刷新监听器ContextRefreshListener,最后调用父类AbstractApplicationContext类的refresh方法去刷新初始化该IOC容器。

 

3.3、初始化Spring mvc特定类实例

在刷新spring mvc IOC容器是会触发刷新上下文事件,触发调用ContextRefreshListener的处理事件方法onApplicationEvent,该方法最后调用onRefresh方法。onRefresh方法被FrameServlet的子类DispatcherServlet重写,并且调用initStrategies方法,而在initStrategies方法中分别调用了对应方法去初始化对应类实例(比如视图解析器、HandlerMapping、HandlerAdapter等)。initStrategies内的方法如下,可从方法名看出其大致功能

1.initMultipartResolver(MultipartResolver类实例):从ApplicationContext容器获取MultipartResolver实例,该实例是多文件上传解析器。

2.initLocalResolver(LocalResolver类实例)

3.initThemeResolver(ThemeResolver类实例)

4.initHandlerMappings(HandlerMapping类实例)

5.initHandlerAdapters(HandlerAdapter类实例)

6.initHandlerExceptionResolvers(HandlerExceptionResolver类实例)

7.initRequestToViewNameTranslator(RequestToViewNameTranslator类实例)

8.initViewResolvers(ViewResolver类实例)

9.initFlashMapManager(FlashMapManager类实例)

 

以下对这些特定类的简要说明

 

Bean类型 说明
HandlerMapping 将传入的请求映射到处理类和拦截器
HandlerAdapter 处理类的适配器,帮助DispatcherServlet去调用对应请求的处理类的执行,并且忽略掉处理类的具体实现。
HandlerExceptionResolver 将异常映射到指定的视图展示
ViewResolver 将字符型视图名称解析成实际的View类型。
LocaleResolver 解析客户端本地化,使应用支持国际化视图展示
ThemeResolver 解析主题资源给web应用程序。比如给web应用提供定制布局
MultipartResolver 解析multipart方式请求,比如文件上传

FlashMapManager

存储和查找输入和输出的FlashMap,用作传递属性,从一个请求到另外一个,通常是用在重定向redirect。

 

注:如果在Spring mvc的配置文件中没有配置这些特定的bean,Spring mvc将使用默认配置文件去处理,该文件是在spring-webmvc.jar包下的DispatcherServlet.properties文件。

 

4、总结

在Spring mvc容器启动时,首先会调用ContextLoaderListener监听器去初始化根IOC容器,该容器代表Spring IOC容器。之后在构建和初始化DispatcherServlet容器时先实例化DispatcherServlet对象,再构建和初始化Spring mvc IOC容器,该容器的父节点是Spring IOC容器。这两个IOC容器都被缓存在ServletContext对象中,可调用相应工具类(比如WebApplicationContextUtils)查找出来。

 

 

  • 大小: 4.9 KB
  • 大小: 5.9 KB
分享到:
评论

相关推荐

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    spring-framework-3.1.0.RELEASE.zip

    你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    webx3框架指南PDF教程附学习Demo

    该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用,并附学习...3.1.1. 初始化级联的Spring容器 ............................................................... 24 3.1.2. 初始化日志系统 ..............

    javaSE代码实例

    5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值规则 68 5.5 数组的常用操作 69 5.5.1 数组复制 69 5.5.2 数组排序 71 ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.7.3 Web应用初始化参数的配置 3.7.4 application对象应用示例 3.8 其他内置对象的应用 3.8.1 应答与请求的page对象 3.8.2 页面上下文的page Context对象 3.8.3 获取web.xml配置信息的config对象 3.8.4 获取异常...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目源代码

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

Global site tag (gtag.js) - Google Analytics