原创内容,转载请注明出处
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)查找出来。
相关推荐
在 `web.xml` 中,我们定义 DispatcherServlet,并指定其初始化参数,指向 `servlet-context.xml` 文件。`servlet-context.xml` 文件中则配置了 MVC 相关的组件,如 HandlerMapping、HandlerAdapter、ViewResolver ...
1. 初始化项目:你可以使用Spring Initializr(start.spring.io)来初始化一个新的Spring Boot项目。选择Java作为语言,Spring Boot的最新稳定版本,然后添加Spring Web依赖。 2. 项目结构:Spring Boot项目通常...
它读取配置文件(如servlet.xml),初始化控制器、视图解析器等组件。 - **HandlerMapping**:用于将URL映射到特定的控制器方法上。 - **Controller**:处理来自用户的请求,执行相应的业务逻辑,并返回一个...
【标题】"Spring MVC+MyBatis项目代码"是一个针对初学者的实践教程,它结合了两种主流的Java Web开发框架——Spring MVC和MyBatis,以帮助学习者理解如何在实际项目中整合这两个框架。Spring MVC是Spring框架的一...
二、Spring MVC——模型视图控制器 Spring MVC是Spring框架提供的Web应用开发模型,它将请求处理逻辑、业务逻辑和视图分离,使代码结构更加清晰。 2.1 请求处理流程 一个典型的Spring MVC请求处理流程包括: - ...
在项目中,你可以通过`@Configuration`注解标记一个类为配置类,然后使用`@Bean`注解来声明和初始化对象。 Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。在零配置环境...
它负责调度请求到相应的控制器,处理异常,以及初始化和管理其他Spring MVC组件。 5. **配置**:在Spring MVC中,配置通常包括Spring的XML配置文件或者使用Java配置。在这个例子中,可能有一个`springmvc-servlet....
在`web.xml`配置文件中,我们需要定义这个Servlet,并指定它的初始化参数`contextConfigLocation`,用于指示Spring MVC的配置文件位置。通常,这个配置文件会包含关于处理器映射、视图解析器、拦截器以及其他服务的...
在本项目实战“Spring-MVC”中,我们将深入探索Spring框架的一个重要组成部分——Spring MVC(Model-View-Controller)。Spring MVC是Spring框架提供的一种用于构建Web应用程序的模型视图控制器架构,它简化了开发...
SSM基础框架是Java开发中常用的三大组件——Spring、Spring MVC和MyBatis的集成,它们共同构建了一个高效、灵活的后端应用架构。在这个全注解版本中,我们将探讨如何利用注解来简化配置,实现快速开发。 首先,...
3. **项目初始化**:创建一个新的Maven项目,并添加必要的依赖库。 4. **数据库准备**:搭建好MySQL数据库,并创建好所需的表结构。 #### 五、整合步骤详解 1. **添加依赖** 在pom.xml文件中添加Spring和MyBatis...
- Spring Boot简化了Spring应用的初始设置和配置,提供了一种快速启动和运行Spring应用的方式。 - 自动配置、嵌入式Web服务器、健康检查、Actuator等功能让Spring Boot成为微服务开发的首选。 8. **Spring Data**...
- `<init-param>`: 设置了初始化参数`contextConfigLocation`,用于指定Spring MVC配置文件的位置。 - `<load-on-startup>`: 设置了该Servlet在启动时加载的优先级,数字越小优先级越高。在这里设置为2表示在...
除了上述的注解,Spring MVC还有许多其他注解,如`@SessionAttributes`用于在session中存储模型数据,`@ExceptionHandler`用于全局异常处理,`@InitBinder`用于初始化数据绑定行为,等等。这些注解共同构建了一个...
- **步骤一:初始化Spring容器** 首先,我们需要创建一个XML配置文件,用于定义Bean的结构和依赖关系。例如: ```xml !" /> ``` - **步骤二:定义前端控制器** 创建一个`DispatcherServlet`类,该类...
2. 配置DispatcherServlet:在`web.xml`中配置Spring MVC的核心组件`DispatcherServlet`,指定其初始化参数,如视图解析器的类名。 3. 启动服务器:运行项目,访问`http://localhost:8080/hello`,你应该能看到...
- **设值注入**:通过setter方法注入依赖,这种方式相对灵活但可能导致延迟初始化问题。 - **Bean封装机制** - **Bean Wrapper**:提供了一种包装Bean的方式,使开发者能够通过标准接口访问和修改Bean属性。 ...
6. **依赖注入(Dependency Injection)**:Spring MVC利用Spring框架的核心特性——依赖注入,实现对象之间的协作。通过配置文件,Spring会自动创建并管理对象,使得代码更加解耦和易于测试。 7. **其他组件**:...
- **初始化项目**:通过Eclipse创建一个新的Maven Web项目。 ```plaintext 1. File -> New -> Other -> Maven Project 2. 选择适当的archetype,例如maven-archetype-webapp 3. 输入项目的基本信息,例如...