专栏首页JavaEdgeIoC容器在Web容器中的创建及初始化

IoC容器在Web容器中的创建及初始化

在前面我们分析了IoC容器的基本实现,下面我们来看看在Web容器中,Spring MVC是建立在IoC容器基础上的.了解Spring MVC,首先要了解Spring IoC容器是如何在Web环境中被载入并起作用的.

Spring IoC是一个独立的模块,并不是直接在Web容器中发挥作用的,要在Web环境中使用IoC容器,需要Spring为IoC设计一个启动过程,把IoC容器导入,并在Web容器中建立起来.

先来看一个实际项目场景:

上面是web.xml配置文件中的主要部分

contextConfigLocation 对应的value是Spring配置文件的绝对路径 监听器主要用来对Servlet容器(这里指Tomcat)的行为进行监听

我们先来看看监听器类 ContextLoaderListener 中有什么东西

ContextLoaderListener源码

可以发现 ContextLoaderListener 继承自 ContextLoader,并且还实现了 ServletContextListener 并且它的构造函数中传入了一个WebApplicationContext,它是继承自ApplicationContext接口的高级IoC容器。

ServletContextListener的源码

ServletContextListener  Servlet 中比较重要的一个接口:监听 Servlet 容器的启动和销毁事件.所以在 ContextLoaderListener 中:

contextInitialized :参数为所要监听的ServletContextEvent,也就是Tomcat启动加载完web.xml会产生的事件,ServletContextEvent 持有从web.xml加载的初始化配置的 ServletContext 上下文 contextDestroyed :在Tomcat关闭的时候执行该方法

启动时,ServletContextListener 的执行顺序与web.xml中的配置顺序一致,停止时执行顺序正相反

梳理流程:当Servlet容器启动事件发生时,将被ContextLoaderLister 监听。此时 ContextLoaderListener 会调用实现 ServletContextListener 接口后实现的 contextInitialized 方法,并把在web.xml加载初始化后获取的 ServletContext 传入initWebApplicationContext方法中进行IoC容器的初始化

initWebApplicationContext 方法从 ContextLoader 继承而来,进入ContextLoader 源码中看看

ContextLoader类中的静态代码块

建一个 ClassPathResource 对象,同时把值为 ContextLoader.properties 的一个常量作为参数传入。易知ContextLoader.properties 文件与 ContextLoader 类是在同一个目录下的;ContextLoader.properties 文件内容如下

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

因此可知Spring默认初始化的是 XmlWebApplicationContext 容器

得到一个 Properties 对象,后面将根据类名来创建对应的 ApplicationContext 容器

下面看看 initiWebApplicationContext 方法

initWebApplicationContext方法源码

现在可以接着刚才的流程:当调用ContextLoaderListener中的initWebApplicationContext方法并且将获取到的servletContext作为参数传入之后,initWebApplicationContext首先会尝试从servletContext中获取根容器,如果容器不为空,则容器初始化失败,因为web.xml中可能定义了多个IoC容器的加载器。假如此时容器还未初始化,则调用createWebApplicationContext方法创建一个容器。创建完容器之后,将会调用一个非常重要的configureAndRefreshWebApplicationContext方法。在执行这个方法的时候,会将从ApplicationContext.xml配置文件中获取到的内容配置到已经创建好了的XmlWebApplicationContext容器中去,并调用refresh方法来完成容器的初始化。然后,再将已经完成初始化的XmlWebApplicationContext容器注册到servletContext中去。

其实在Web容器中,ServletContext为Spring的IoC容器提供了宿主环境,对应的建立起一个IoC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象、数据存取对象、资源、事务管理器等各种中间层对象。在这个上下文的基础上,与Web MVC相关还会有一个上下文来保持控制器之类的MVC对象,这样就构成了一个层次化的上下文结构。因为在initWebApplicationContext方法中我们可以看到其实创建ApplicationContext容器的工作是交由createWebApplicationContext方法来实现的,下面我们来看看这个方法

createWebApplicationContext源码

此方法功能

决定要创建的ApplicationContext类型 实例化一个ApplicationContext

那么它是如何决定要创建的ApplicationContext类型的呢?

起作用的是determineContextClass方法

determineContextClass源码

完成IoC容器的创建后,在initWebApplicationContext中将调用configureAndRefreshWebApplicationContext初始化该容器

为创建好的IoC容器设置Web应用的上下文,以便二者整合 为同一个IoC容器设置配置文件的绝对路径 调用IoC容器的refresh函数对其进行初始化

configureAndRefreshWebApplicationContext源码

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并发编程实战系列5之基础构建模块

    1 同步容器类 同步容器类包括Vector和HashTable,二者是早期JDK一部分,此外还包括在JDK 1.2中添加的一些功能相似的类,这些的同步封装器类是...

    JavaEdge
  • Docker容器实战(五) - 特殊的进程!

    所以会以Docker和Kubernetes项目为核心,为你详细介绍容器技术的各项实践与其中的原理。

    JavaEdge
  • IoC容器系列的设计与实现(基于Spring5.0.4)1 Spring的IoC容器系列2 Spring IoC容器的设计3 BeanFactory的应用场景4 BeanFactory容器的设计原理5

    JavaEdge
  • docker--docker介绍

    在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中...

    eadela
  • 漫谈容器监控

    很多事情说起来容易,做起来却很难,开始的时候就已经经历了各种选择,而开始才是一个真正开始。

    SRE运维实践
  • 如何通过SSH进入正在运行的容器【Containers】

    容器已经改变了我们对虚拟化的思考方式。您可能还记得从虚拟化BIOS,操作系统和内核到每个虚拟化网络接口控制器(NIC)的虚拟机已满堆栈的日子(或者您可能还活着)...

    王欣壳
  • Docker容器数据持久化和容器网桥连接

    该命令是通过一个镜像启动一个容器。 用--name指定容器的名称; 用-v指定宿主机的某目录作为数据卷挂载到容器中,使该容器与宿主机共享此目录 。

    软测小生
  • 容器技术在企业落地的9个关键问题

    当今容器技术被广泛关注,已经有越来越多的企业开始布局或者已经采用容器技术来构建自己的云基础设施。 .

    孙杰
  • 为什么保护容器和微服务很难?

    开发人员可用容器创建微服务,也就是应用的可重用组件。因为可重用,微服务能帮开发人员免掉重新开发的时间。另外,微服务可跨不同平台部署。

    用户6543014
  • 关于容器、微服务、docker的十大问题

    容器的运行无法简单参考虚拟机的实践经验。例如,几乎任何工作负载都可以立即虚拟化,但是有些工作负载适合容器化部署,有的则不适合。

    FB客服

扫码关注云+社区

领取腾讯云代金券