发散问题——Spring容器及加载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发散问题——Spring容器及加载相关的知识,希望对你有一定的参考价值。

一、前言

发散问题系列,是围绕日常工作,发散思考,提取问题,并寻求答案的一个系列。总的来说,就是将遇到的问题发散来提出更多的问题,并通过解决发散问题,从而对问题有更深入的了解,对知识有更深刻的记忆,帮助自身的提高。欢迎大家将问题继续发散,或者将已有问题更深入的阐述,以达到共同进步的目的。

   

二、背景描述

有这样一个几个相关的工程:

技术分享

Shell层打包成war包后,会将其他几个项目的jar包引用到WEB_INF\\lib目录下

技术分享

这些工程的结构大致是这样子的:

技术分享

   

三、问题提出

如果在shell项目的web.xml中,有设置如下:

   <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/META-INF/spring/*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

那么,

1Spring的容器是什么,用来干什么?

答:Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring Beans。通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XMLJava 注释或 Java 代码来表示。

   

2)应用会加载哪些xml配置文件到spring中(本项目的xml、还是包括其他项目的xml,还会包括jar包的xml吗?)

答:这里要留意到"classpath*"这个符号,web.xmlclasspathclasspath*有以下区别:

classpath:只会到你的class路径中查找找文件;

classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找

所以,这样子配置的话,会搜索本项目xml、其他项目xml以及jar包中的xml。只要是位于/META-INF/spring/目录下的xml,都会作为Spring容器的配置文件加载到一起。

   

3web.xml中指示读了一堆xml,那这些配置是作为同一个容器,还是分开多个容器?

答:作为同一个容器来读取,也就是说,所有提到的xml里面的bean都会装载到一个容器上来。

   

4)这些xml的加载顺序是怎么样的?

答:经试验,顺序不确定,所以建议定义的每个xml有自己的工作范围,xmlxml之间不要有太多的关系,例如xml之间的bean互相引用,这样子可能会造成加载时的问题。

以上是关于发散问题——Spring容器及加载的主要内容,如果未能解决你的问题,请参考以下文章

《Spring揭秘》---- IoC容器及Bean的生命周期

Spring源码分析之-加载IOC容器

Spring容器启动流程

Spring源码阅读Spring容器启动原理(上)-配置资源加载和注册

Spring容器初始化方法的应用及注意对象

Spring源码解析 – @Configuration配置类及注解Bean的解析