SpringMVC源码阅读:ContextLoaderListener初始化过程

概述

  • Tomcat或Jetty作为Servlet容器会为每一个Web应用构建一个ServletContext用于存放所有的Servlet, Filter, Listener。
  • ContextLoaderListener 作为一个Listener会首先启动,创建一个WebApplicationContext用于加载除Controller等Web组件以外的所有bean,这个ApplicationContext作为根容器存在,对于整个Web应用来说,只能存在一个,也就是父容器,会被所有子容器共享,子容器可以访问父容器里的bean,反过来则不行。

web.xml配置

ContextLoaderListener监听器的作用就是启动web容器时,自动装配ApplicationContext的配置信息。它实现了ServletContextListener接口,在web.xml文件中配置这个监听器,Tomcat或Jetty启动容器时,就会默认执行它实现的方法。

<!-- 配置spring IOC参数路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring-context*.xml</param-value>
    </context-param> 
<!-- Spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-    
         class>
    </listener>

通过扩展ContextLoaderListener类,可以增加初始化时的个性化功能,如输出产品的信息等。

获取WebApplicationContext的实现类

在org.springframework.web.context.ContextLoader中有一个静态属性,

static {
        // Load default strategy implementations from properties file.
        // This is currently strictly internal and not meant to be customized
        // by application developers.
        try {
            ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
            defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
        }
        catch (IOException ex) {
            throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
        }
    }

默认的DEFAULT_STRATEGIES_PATH=ContextLoader.properties,路径在ContextLoader类的同一级目录下,都在spring-web-..*.RELEASE.jar包内。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

实际的实例化为org.springframework.web.context.support.XmlWebApplicationContext。

知识点

  • org.springframework.core.ioClassPathResource和PropertiesLoaderUtils.loadProperties()组合读取jar包中的properties配置文件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–转包(138)-4发货过账

3.5 VL02N拣配确认(可选) 该活动拣配、包装并发运相关部件到供应商,此步骤只在拣配不需要 WM 调拨订单的情况下执行。 角色:仓库文员 后勤 -后勤...

3244
来自专栏清晨我上码

第六节 netty前传-NIO Selector

可以使用单个线程来处理多个channel来节省资源。对于操作系统而言,线程之间切换是昂贵的,并且每个线程也占用操作系统中的一些资源(存储器)。 因此,使用的线程...

1312
来自专栏coolblog.xyz技术专栏

基于 Java NIO 实现简单的 HTTP 服务器

本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理。本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Jav...

69312
来自专栏运维前线

umount: /var: device is busy

去掉挂载显示device is busy 出现此问题是当前挂载点上面有进程存在 [root@zabbix ~]# umount /dev/mapper/v...

2279
来自专栏java 成神之路

NIO 之 Channel实现原理

46014
来自专栏SAP最佳业务实践

SAP最佳业务实践:SD–按计划协议的销售(231)-3发货

一、VL10E交货到期清单 在此活动中,可以处理交货到期清单,以便创建交货凭证。 角色仓库文员 后勤 → 后勤执行 → 外向处理→外向交货的发货→ 外向交货→ ...

5156
来自专栏javathings

Java 的 NIO 是如何工作的?

在这个数据爆炸的时代,有大量的数据在系统中流动,一个应用系统的瓶颈往往都是 IO 瓶颈。传统的 javaIO 模型是 BIO,也就是同步阻塞 IO,数据在写入 ...

1301
来自专栏社区的朋友们

TAF 必修课(二):Reactor多线程模型

最近看了很多文章和分享,非常受益, 实习所做项目主要用到了TAF,有必要对之前的学习做个梳理和总结,网络线程模型及请求接收过程,必修亦为基础、通用,故取其名。

9091
来自专栏chenssy

【死磕Netty】-----NIO基础详解

原文出处http://cmsblogs.com/ 『chenssy』 转载请注明原创出处,谢谢! Netty 是基于Java NIO 封装的网络通讯框架,只有充...

4546
来自专栏Ryan Miao

spring boot 添加拦截器

构建一个spring boot项目。 添加拦截器需要添加一个configuration @Configuration @ComponentScan(basePa...

4098

扫码关注云+社区

领取腾讯云代金券