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)查找出来。

猜你喜欢

转载自ylxy3058.iteye.com/blog/2230194