ContextLoaderListener类是负责初始化IOC容器,即在我们的web项目中,这里就是IOC容器初始化的入口,由这个类启动IOC容器的初始化。

它配置在web.xml中,比如如下配置:

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:context/applicationContext.xml</param-value></context-param><!-- Spring监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

跟踪ContextLoaderListener类,可以看到有一个如下方法

protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {String configLocationParam;if(ObjectUtils.identityToString(wac).equals(wac.getId())) {configLocationParam = sc.getInitParameter("contextId");if(configLocationParam != null) {wac.setId(configLocationParam);} else {wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + ObjectUtils.getDisplayString(sc.getContextPath()));}}wac.setServletContext(sc);configLocationParam = sc.getInitParameter("contextConfigLocation");   //很显然这里就是读取web.xml中配置的资源文件的路径,也就是上述context-param
标签配置的参数if(configLocationParam != null) {wac.setConfigLocation(configLocationParam);}ConfigurableEnvironment env = wac.getEnvironment();if(env instanceof ConfigurableWebEnvironment) {((ConfigurableWebEnvironment)env).initPropertySources(sc, (ServletConfig)null);}this.customizeContext(sc, wac);wac.refresh();   //有了资源文件后,在这里开启IOC容器的初始化}

refresh方法的实现是在AbstractApplicationContext类中,代码如下:

public void refresh() throws BeansException, IllegalStateException {Object var1 = this.startupShutdownMonitor;synchronized(this.startupShutdownMonitor) {this.prepareRefresh();ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();this.prepareBeanFactory(beanFactory);try {this.postProcessBeanFactory(beanFactory);this.invokeBeanFactoryPostProcessors(beanFactory);this.registerBeanPostProcessors(beanFactory);this.initMessageSource();this.initApplicationEventMulticaster();this.onRefresh();this.registerListeners();this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh();} catch (BeansException var9) {if(this.logger.isWarnEnabled()) {this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);}this.destroyBeans();this.cancelRefresh(var9);throw var9;} finally {this.resetCommonCaches();}}}

上述代码就会进行完整的IOC容器的初始化

Spring IOC学习心得之源码级分析ContextLoaderListener的作用(IOC容器初始化入口)相关推荐

  1. fork的黑科技,它到底做了个啥,源码级分析linux内核的内存管理

    最近一直在学习linux内核源码,总结一下 https://github.com/xiaozhang8tuo/linux-kernel-0.11 一份带注释的源码,学习用. fork的黑科技,它到底做 ...

  2. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 代云小说网 https://www.3187.info ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批 ...

  3. Shell主要逻辑源码级分析(1)——SHELL运行流程

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由李航原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communit ...

  4. Adroid学习之 从源码角度分析-禁止使用回退按钮方案

    有时候,不能让用户进行回退操作,如何处理? 查看返回键触发了哪些方法.在打开程序后把这个方法禁止了. 问题:程序在后台驻留,这样就会出现,其他时候也不能使用回退按钮.如何处理,在onpase()时方法 ...

  5. 彻底搞懂equals以及hashCode方法(源码级分析)

    在开发过程中,我们经常会遇到要重写equals方法和重写hashCode方法的情况,那么,我们为什么要重写这个两个方法呢?重写这个两个方法有什么实际的作用吗?先别急,我们一一来分析,先看equals方 ...

  6. JDK1.8HashMap源码级分析

    任何不谈论JDK版本的HashMap介绍不是小白就是在耍流氓,所以本文是基于JDK1.7版本的HashMap分析,其中涉及到了面试常问的问题以及核心方法的源码分析 JDK1.8HashMap 红黑树前 ...

  7. 如何使用Easy-POI导入复杂表头的Excel报表(含源码级分析)

    本文旨在解决使用Easy-POI导入复杂表头(导出)时,遇上的EXCEL文件中的字段无法正常映射到Bean的问题,官方的示例和其他的CSDN文章基本上没有很详细的教程,于是自己写一个 这是需要导入的表 ...

  8. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  9. Spring原理学习系列之三:Spring AOP原理(从源码层面分析)-------上部

    引言 本文是Spring原理分析的第三篇博文,主要阐述Spring AOP相关概念,同时从源码层面分析AOP实现原理.对于AOP原理的理解有利于加深对Spring框架的深入理解.同时我也希望可以探究S ...

最新文章

  1. UF_DRAW_set_view_display 使用问题
  2. HTC与酷派 不是冤家不聚头
  3. Spring 配置标签——util标签
  4. java里函数式表达式_Java8函数式编程 (一) 数据流和lambda表达式
  5. linux挂载磁盘分区,Linux 新磁盘分区与挂载
  6. SAP CDS view 单元测试框架 Test Double 介绍
  7. 谷歌浏览器书签栏怎么隐藏 谷歌Chrome浏览器书签栏隐藏教程
  8. 【2019南京网络赛:F】Greedy Sequence(set/线段树 + 思维)
  9. mysql系统表查询sql server_sql server查看所有数据库
  10. java读取pdf多表格_怎么用java读取pdf中的表格
  11. 初学者必读VRay 2.0材质设置(2)——反射材质的表现
  12. 图表数据分析怎么做,举实例给你说清楚
  13. 职教mooc计算机组装与维护课程网课答案,2020-网课答案-高职心理辅导与教育-中国大学mooc...
  14. 《西部世界》第三季开播,机器人会比人类更有人性吗?
  15. Java网络编程基础--Netty预备知识
  16. git的一套全流程上手(不包括报错(我忘了有哪些报错了)以及其解决方案(篇幅问题))...
  17. 10分钟读懂什么是容器云?
  18. python简单体育竞技模拟_2019-05-12 Python之模拟体育竞赛
  19. 当当CEO李国庆斥资本竞争靠烧钱垄断市场 被海航抛弃的当当怎么了
  20. 当类型设置为Integer时,传入的值为0,会将其转化为空字符串,从而造成查询数据异常

热门文章

  1. springAOP与注解
  2. 洛谷 P1396 营救
  3. P1103 书本整理
  4. 使用Gpg4Win+Outlook Express实现发送和接收加密邮件
  5. Mininet与真实网络链接的方法
  6. [物理学与PDEs]第1章习题6 无限长载流直线的磁场
  7. 如何使用移动硬盘加密
  8. JUnit5 预期的异常 – assertThrows()示例
  9. 卡图星小机器人怎么过_安徽交通广播90.8专题报道:阿尔法大蛋机器人,家里的新成员!...
  10. Python 正则表达式(二)