`

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
分享到:
评论

相关推荐

    Spring Mvc——基本使用

    在 `web.xml` 中,我们定义 DispatcherServlet,并指定其初始化参数,指向 `servlet-context.xml` 文件。`servlet-context.xml` 文件中则配置了 MVC 相关的组件,如 HandlerMapping、HandlerAdapter、ViewResolver ...

    Spring Boot——2分钟构建spring web mvc REST风格HelloWorld

    1. 初始化项目:你可以使用Spring Initializr(start.spring.io)来初始化一个新的Spring Boot项目。选择Java作为语言,Spring Boot的最新稳定版本,然后添加Spring Web依赖。 2. 项目结构:Spring Boot项目通常...

    spring MVC中文教程

    它读取配置文件(如servlet.xml),初始化控制器、视图解析器等组件。 - **HandlerMapping**:用于将URL映射到特定的控制器方法上。 - **Controller**:处理来自用户的请求,执行相应的业务逻辑,并返回一个...

    spring mvc+mybatis项目代码

    【标题】"Spring MVC+MyBatis项目代码"是一个针对初学者的实践教程,它结合了两种主流的Java Web开发框架——Spring MVC和MyBatis,以帮助学习者理解如何在实际项目中整合这两个框架。Spring MVC是Spring框架的一...

    spring ioc+mvc代码

    二、Spring MVC——模型视图控制器 Spring MVC是Spring框架提供的Web应用开发模型,它将请求处理逻辑、业务逻辑和视图分离,使代码结构更加清晰。 2.1 请求处理流程 一个典型的Spring MVC请求处理流程包括: - ...

    spring + spring mvc + hibernate 之零配置之路源代码

    在项目中,你可以通过`@Configuration`注解标记一个类为配置类,然后使用`@Bean`注解来声明和初始化对象。 Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。在零配置环境...

    spring mvc

    它负责调度请求到相应的控制器,处理异常,以及初始化和管理其他Spring MVC组件。 5. **配置**:在Spring MVC中,配置通常包括Spring的XML配置文件或者使用Java配置。在这个例子中,可能有一个`springmvc-servlet....

    spring mvc 框架 原理 机制

    在`web.xml`配置文件中,我们需要定义这个Servlet,并指定它的初始化参数`contextConfigLocation`,用于指示Spring MVC的配置文件位置。通常,这个配置文件会包含关于处理器映射、视图解析器、拦截器以及其他服务的...

    项目实战spring—mvc.zip

    在本项目实战“Spring-MVC”中,我们将深入探索Spring框架的一个重要组成部分——Spring MVC(Model-View-Controller)。Spring MVC是Spring框架提供的一种用于构建Web应用程序的模型视图控制器架构,它简化了开发...

    SSM基础框架(整合Spring、Spring MVC 、MyBatis-plus)(全注解版)

    SSM基础框架是Java开发中常用的三大组件——Spring、Spring MVC和MyBatis的集成,它们共同构建了一个高效、灵活的后端应用架构。在这个全注解版本中,我们将探讨如何利用注解来简化配置,实现快速开发。 首先,...

    MyBatis与Spring整合——通过官方文档进行最简单的整合

    3. **项目初始化**:创建一个新的Maven项目,并添加必要的依赖库。 4. **数据库准备**:搭建好MySQL数据库,并创建好所需的表结构。 #### 五、整合步骤详解 1. **添加依赖** 在pom.xml文件中添加Spring和MyBatis...

    Spring开发指南——中文版

    - Spring Boot简化了Spring应用的初始设置和配置,提供了一种快速启动和运行Spring应用的方式。 - 自动配置、嵌入式Web服务器、健康检查、Actuator等功能让Spring Boot成为微服务开发的首选。 8. **Spring Data**...

    spring mvc 框架

    - `<init-param>`: 设置了初始化参数`contextConfigLocation`,用于指定Spring MVC配置文件的位置。 - `<load-on-startup>`: 设置了该Servlet在启动时加载的优先级,数字越小优先级越高。在这里设置为2表示在...

    spring—MVC的注解实例

    除了上述的注解,Spring MVC还有许多其他注解,如`@SessionAttributes`用于在session中存储模型数据,`@ExceptionHandler`用于全局异常处理,`@InitBinder`用于初始化数据绑定行为,等等。这些注解共同构建了一个...

    京东T5级大牛带你解读Spring核心源码——1小时手写SpringMVC~

    - **步骤一:初始化Spring容器** 首先,我们需要创建一个XML配置文件,用于定义Bean的结构和依赖关系。例如: ```xml !" /> ``` - **步骤二:定义前端控制器** 创建一个`DispatcherServlet`类,该类...

    【转】-HelloWorld(Spring Web MVC)

    2. 配置DispatcherServlet:在`web.xml`中配置Spring MVC的核心组件`DispatcherServlet`,指定其初始化参数,如视图解析器的类名。 3. 启动服务器:运行项目,访问`http://localhost:8080/hello`,你应该能看到...

    spring+MVC中文教程

    - **设值注入**:通过setter方法注入依赖,这种方式相对灵活但可能导致延迟初始化问题。 - **Bean封装机制** - **Bean Wrapper**:提供了一种包装Bean的方式,使开发者能够通过标准接口访问和修改Bean属性。 ...

    springmvc详细讲解

    6. **依赖注入(Dependency Injection)**:Spring MVC利用Spring框架的核心特性——依赖注入,实现对象之间的协作。通过配置文件,Spring会自动创建并管理对象,使得代码更加解耦和易于测试。 7. **其他组件**:...

    基于Maven的Spring_+_Spring_MVC_+_Mybatis的环境搭建

    - **初始化项目**:通过Eclipse创建一个新的Maven Web项目。 ```plaintext 1. File -> New -> Other -> Maven Project 2. 选择适当的archetype,例如maven-archetype-webapp 3. 输入项目的基本信息,例如...

Global site tag (gtag.js) - Google Analytics