spring源码研究之IoC容器在web容器中初始化过程

2023-11-11

前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚。所以就抽时间看一下spring的源代码,借此了解它的原理。

    我们知道,对于使用Spring的web应用,无须手动创建Spring容器,而是通过配置文件,声明式的创建Spring容器。因此在Web应用中创建Spring容器有如下两种方式:

    1. 直接在web.xml文件中配置创建Spring容器。

    2. 利用第三方MVC框架的扩展点,创建Spring容器。

    其实第一种方式是更加常见。为了让Spring容器随Web应用的启动而启动,有如下两种方式:

    1. 利用ServletContextListener实现。

    2. 利用load-on-startup Servlet实现。

    Spring提供ServletContextListener的一个实现类ContextLoaderListener,该类可以作为Listener 使用,它会在创建时自动查找WEB-INF下的applicationContext.xml文件,因此,如果只有一个配置文件,并且文件名为applicationContext.xml,则只需在web.xml文件中增加以下配置片段就可以了

<listener>  
      <listener-class>  
        org.springframework.web.context.ContextLoaderListener  
      </listener-class>  
</listener> 
如果有多个配置文件需要载入,则考虑 使用<context-param...>元素来确定配置文件的文件名ContextLoaderListener加载时,会查找名为contentConfigLocation的初始化参数。因此,配置<context-param...>时就指定参数名为contextConfigLocation。

    带多个配置文件的web.xml文件如下:

    <context-param>    
         <param-name>contextLoaderListener</param-name>  
         <param-value>     
                WEB-INF/*.xml, classpath:spring/*.xml  
         </param-value>  
    </context-param>  

    <listener>  
          <listener-class>  
            org.springframework.web.context.ContextLoaderListener  
          </listener-class>  
    </listener>  
  多个配置文件之间用“,”隔开。

 

    下面我们来看它的具体实现过程是怎样的,首先我们从ContextLoaderListener入手,它的代码如下:

    public class ContextLoaderListener implements ServletContextListener   
    {  
      
        private ContextLoader contextLoader;  
      
      
        /** 
         * 这个方法就是用来初始化web application context的 
         */  
        public void contextInitialized(ServletContextEvent event)   
                    {  
            this.contextLoader = createContextLoader();  
            this.contextLoader.initWebApplicationContext(event.getServletContext());  
        }  
      
        /** 
         * 创建一个contextLoader. 
         * @return the new Contex
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring源码研究之IoC容器在web容器中初始化过程 的相关文章

随机推荐

  • 图的拓扑序列

    拓扑序列 拓扑序是按照点的先后顺序排列的 拓扑序列满足以下两点 1 每个顶点在序列中出现且只出现一次 2 若存在一条从顶点 A 到顶点 B 的路径 那么在序列中顶点 A 出现在顶点 B 的前面 拓扑序列只存在于有向无环图中 可以理解成一个将
  • replace和replaceAll区别

    1 replace的参数是char和CharSequence 即可以支持字符的替换 也支持字符串的替换 CharSequence即字符串序列的意思 说白了也就是字符串 2 replaceAll的参数是regex 即基于规则表达式的替换 比如
  • 浅谈一下Python的现状、发展前景以及Python的就业岗位(含趋势)

    在面对职业选择时我们难免纠结 徘徊 不知道去哪能走多远 我们没有办法只考虑当下 无视未来 当下Python工程师正处于人才需求旺盛 供应短缺的时期 工资一路上涨 假如 即便选择了目前火热的Python编程 那你需要先来了解一下Python的
  • 知识产权贯标补贴政策查询大全及怎么申请,奖励20万

    华夏泰科小编认为知识产权贯标旨在促进企业知识产权创造 运用 保护能力提高 使管理工作制度化 规范化 常规化 整体推进全省企业知识产权管理水平有效提升 申请后可以提升企业无形资产价值 巩固企业市场地位 可向科技主管部门申请战略推进项目 专利实
  • win10下设置maven环境变量

    一 先去maven官网 http maven apache org download cgi 下载压缩包 下拉页面可以看到好多版本 注意下载的版本为红色标注版本 apache maven 3 5 0 bin zip 点击下载即可 二 将下载
  • JSR303(一) 简介

    1 简介 数据校验是任何一个应用程序都会用到的功能 无论是显示层还是持久层 通常 相同的校验逻辑会分散在各个层中 这样 不仅浪费了时间还会导致错误的发生 译注 重复代码 为了避免重复 开发人员经常会把这些校验逻辑直接写在领域模型里面 但是这
  • 关于$'\r': command not found错误的一点体会

    今天运行一个其他组开发的jar包 这个jar包由于运行参数是通过命令行的方式输入的 所以需要运行一个shell脚本来启动 启动脚本类似这样 bin bash jdbc driverClassName com mysql jdbc Drive
  • 力扣-->#剑指Offer 897 . 递增顺序搜索树(E)

    class Solution TreeNode curr public TreeNode increasingBST TreeNode root TreeNode first new TreeNode 1 用first 来记录curr的初始
  • 途客圈创业记--读书笔记

    一 初创公司股权结构 2011年6月公司创立 自筹启动资金50万 1 陈天和Alex 每人出资25万元 总计50万元 作为启动资金 2 陈天 CTO兼董事长 股份60 因为是想法的发起人 且在实现这个想法的过程中 Alex CEO 股份40
  • 【C++学习第三讲】C++语句

    目录 C 语句 一 引入 二 声明语句和变量 1 为什么变量必须声明 三 赋值语句 四 cout新花样 五 cout和printf 六 其他C 语句 1 使用cin 2 使用cout进行拼接 七 类简介 一 引入 C 程序是一组函数 而每个
  • Qt::FramelessWindowHint无边框化,移动,大小调整

    QT工作笔记壹 导读 开发环境 QT界面无边框 方法1 方法2 引用 导读 最近工作一个项目需要用QT设计一个UI 看了一下目前主流商业化UI 例如扣扣 微信 网易云音乐 结合个人审美 本人非美术专业 但游戏经验丰富 对人机交互界面有个人看
  • 为什么有了uwsgi 还要 nginx 服务器

    相信每一个使用nginx uwsgi django部署过的人 都感到非常复杂 到底为什么一个项目的发布要经过这么多层级 他们每一层有什么理由存在 这就带大家宏观地看待一下 首先nginx 是对外的服务接口 外部浏览器通过url访问nginx
  • MyBatis 的执行流程

    前言 MyBatis可能很多人都一直在用 但是MyBatis的SQL执行流程可能并不是所有人都清楚了 那么既然进来了 通读本文你将收获如下 1 Mapper接口和映射文件是如何进行绑定的 2 MyBatis中SQL语句的执行流程 3 自定义
  • Js Vue 获取当月第一天、最后一天、当天

    new Date 效果 2023 06 12 注 本文示例以获取当天为例 一 new Date 在vue中使用new Date 获取当月第一天 最后一天 当天 二 使用步骤 1 定义方法 代码如下 示例 param type 0 第一天 1
  • 如何在Gephi中可视化多层网络

    要借助一个插件实现 Isometric Layout 感谢插件作者对gephi社群提供的贡献 作者网页的图片 下载 url https gephi org plugins plugin isometric layout 点击这儿下载再在Ge
  • centos8.5.111安装mysql8.0

    修改网络源 Connecting to 192 168 182 154 22 Connection established To escape to local shell press Ctrl Alt Activate the web c
  • 关于CSS3:justify-self,justify-items和justify-content之间的区别

    这篇文章应该能帮到你 https www codenong com 48535585 总结 flex布局 这三个属性中 只能用justify content属性 1 justify content 2 justify items 3 jus
  • LeetCode: 高频树结构题目总结 - Python

    LeetCode 高频树结构题目总结 问题描述 LeetCode 98 验证二叉搜索树 根据中序遍历 判断大小 LeetCode 99 恢复二叉搜索树 搜索二叉树有两个节点搞错了 恢复好 LeetCode 100 相同的树 LeetCode
  • MyCobot六轴机械臂(六)--Myblockly模块简介

    1 Logic模块 如图3 11所示 表示if 条件 do 程序1 else 程序2 若满足条件则执行程 序1 否则执行程序2 所表示方法的详细讲解可查看图1 2下方的文字讲解 所表示的逻辑判断 返回值为true或者false 可以点击 中
  • spring源码研究之IoC容器在web容器中初始化过程

    前段时间在公司做了一个项目 项目用了spring框架实现 WEB容器是Tomct 5 虽然说把项目做完了 但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚 所以就抽时间看一下spring的源代码 借此了解它的原理 我