发散问题——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>
那么,
1)Spring的容器是什么,用来干什么?
答:Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring Beans。通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装。配置元数据可以通过 XML,Java 注释或 Java 代码来表示。
2)应用会加载哪些xml配置文件到spring中(本项目的xml、还是包括其他项目的xml,还会包括jar包的xml吗?)
答:这里要留意到"classpath*"这个符号,web.xml中classpath与classpath*有以下区别:
classpath:只会到你的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找
所以,这样子配置的话,会搜索本项目xml、其他项目xml以及jar包中的xml。只要是位于/META-INF/spring/目录下的xml,都会作为Spring容器的配置文件加载到一起。
3)web.xml中指示读了一堆xml,那这些配置是作为同一个容器,还是分开多个容器?
答:作为同一个容器来读取,也就是说,所有提到的xml里面的bean都会装载到一个容器上来。
4)这些xml的加载顺序是怎么样的?
答:经试验,顺序不确定,所以建议定义的每个xml有自己的工作范围,xml与xml之间不要有太多的关系,例如xml之间的bean互相引用,这样子可能会造成加载时的问题。