文档章节

Spring mvc ContextLoaderListener 原理解析

轨迹_
 轨迹_
发布于 06/22 17:29
字数 697
阅读 10
收藏 4

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。

<!-- 加载spring上下文信息,最主要的功能是解析applicationContext.xml -->
<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>  

<!-- 配置applicationContext.xml的位置路径,让ContextLoaderListener进行加载该配置文件,并解析 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml
    </param-value>
</context-param>

ContextLoaderListener有什么用?提供什么功能呢?我们下面通过源码分析下。

ContextLoaderListener 源码分析

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

    public ContextLoaderListener() {
    }

    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }

    //web 容器启动时执行
    @Override
    public void contextInitialized(ServletContextEvent event) {
        //初始化WebApplicationContext对象
        initWebApplicationContext(event.getServletContext());
    }
    //web容器销毁时执行
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

ContextLoaderListener 实现了ServletContextListener 接口。
ServletContextListener 接口我们知道是web容器创建的时候开始执行contextInitialized() 方法,web容器销毁时执行contextDestroyed() 方法。那我们就从contextInitialized() 方法开始分析。

contextInitialized() 方法

public void contextInitialized(ServletContextEvent event) {
    //初始化WebApplicationContext对象
    initWebApplicationContext(event.getServletContext());
}

initWebApplicationContext() 方法

  1. 首先判断servletContext中是否存在WebApplicationContext实例,如果存在说明ServletContextListener在web.xml中多次声明,并抛出异常。
  2. 调用 createWebApplicationContext() 方法创建WebApplicationContext实例
  3. 调用configureAndRefreshWebApplicationContext() 方法通过WebApplicationContext进行解析web.xml中配置的applicationContext.xml。
  4. 把WebApplicationContext实例添加到ServletContext中

createWebApplicationContext()

  1. 调用 determineContextClass() 方法获取WebApplicationContext的Class实例
  2. 通过反射创建WebApplicationContext对象,并返回。

determineContextClass()

  1. 首先判断 servletContext中是否存在contextClass,如果有则直接返回该Class 实例(默认是没有配置该值的)
  2. 从defaultStrategies中通过WebApplicationContext全类名(包名和类名)获取要实现WebApplicationContext接口的类。

defaultStrategies

从当前类的路径下查找 ContextLoader.properties 并加载文件中的键值存储到 defaultStrategies中。

ContextLoader.properties

# Default WebApplicationContext implementation class for ContextLoader.
# Used as fallback when no explicit context implementation has been specified as context-param.
# Not meant to be customized by application developers.

org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

通过WebApplicationContext全类名获取它的实现类是XmlWebApplicationContext。

configureAndRefreshWebApplicationContext()

  1. 获取web.xml中配置的applicationContext.xml路径
  2. 调用refresh()进行加载xml,解析bean。

总结

通过代码分析ContextLoaderListener的作用就是启动Web容器的时候,初始化WebApplicationContext实例,并存放到ServletContext中。

ContextLoaderListener实现了ServletContextListener接口,在Web容器启动的时会默认执行它的contextInitialized() 方法,然后获取WebApplicationContext的实现类 XmlWebApplicationContext,并实例化后存放到ServletContext中,通过XmlWebApplicationContext类进行加载、解析applicationContext.xml 配置文件。ServletContext在整个Web容器范围内都有效,都可以获取得到。

XmlWebApplicationContext类的作用

通过代码可以大概了解到就是读取web.xml中配置的applicationContext.xml ,然后加载解析Bean信息。

© 著作权归作者所有

共有 人打赏支持
轨迹_
粉丝 37
博文 29
码字总数 46357
作品 1
海淀
spring mvc 配置失效了?

版本:spring 3.0以上 项目中有两个spring的配置xml,如下 项目中的web.xml web.xml的配置如下: 1、ContextLoaderListener加载applicationContext-service-database.xml 2、DispatcherServl...

听柳
05/31
0
0
Spring mvc 和 CXF 搭建SOAP环境

最近用Spring mvc框架搭建web工程,后因为业务需要重新需要在原有web工程基础上,添加Webservice接口。这就涉及到一个问题: 在spring mvc 配置文件中如何添加一些WS框架。在添加之初发现一个...

long0419
2014/01/14
0
1
浅析 SpringMVC 原理和配置.

一、原理 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序,将请求处理的逻辑和视图中的渲染实现解耦。 ...

jmcui
2017/12/31
0
0
Spring MVC 原理探秘 - 容器的创建过程

1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。...

coolblog.xyz
07/03
0
0
深入分析Spring 与 Spring MVC容器

Spring经典详解 Spring事务机制详解 Spring配置事务五种方式 关于Spring加载classpath与classpath*的过程剖析 深入分析Spring 与 Spring MVC容器 Spring系列文章 【第1章 Spring概述与结构】...

陶邦仁
2015/10/30
0
5

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 恨不得给你买张飞机挂票

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @开源中国首席灵魂师:分享张希/曹方的单曲《认真地老去》 来不及认真的年轻过,就认真的老去! 《认真地老去》- 张希/曹方 手机党少年们想听...

小小编辑
26分钟前
39
5
如何实现靠谱的分布式锁?

分布式锁,是用来控制分布式系统中互斥访问共享资源的一种手段,从而避免并行导致的结果不可控。基本的实现原理和单进程锁是一致的,通过一个共享标识来确定唯一性,对共享标识进行修改时能够...

郑加威
今天
1
0
Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
4
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部