通过分析ClassPathXmlApplicationContext 的源代码可以知道, 在创建ClassPathXmlApplicationContext 容器时,构造方法做以下两项重要工作:

首先,调用父类容器的构造方法(super(parent)方法)为容器设置好Bean 资源加载器。

然后, 再调用父类AbstractRefreshableConfigApplicationContext 的setConfigLocations(configLocations)方法设置Bean 配置信息的定位路径。

通过追踪ClassPathXmlApplicationContext 的继承体系, 发现其父类的父类AbstractApplicationContext 中初始化IOC 容器所做的主要源码如下:

public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {//静态初始化块,在整个容器创建过程中只执行一次static {//为了避免应用程序在Weblogic8.1 关闭时出现类加载异常加载问题,加载IOC 容//器关闭事件(ContextClosedEvent)类ContextClosedEvent.class.getName();}public AbstractApplicationContext() {this.resourcePatternResolver = getResourcePatternResolver();}public AbstractApplicationContext(@Nullable ApplicationContext parent) {this();setParent(parent);}//获取一个Spring Source 的加载器用于读入Spring Bean 配置信息protected ResourcePatternResolver getResourcePatternResolver() {//AbstractApplicationContext 继承DefaultResourceLoader,因此也是一个资源加载器//Spring 资源加载器,其getResource(String location)方法用于载入资源return new PathMatchingResourcePatternResolver(this);}...
}

AbstractApplicationContext 的默认构造方法中有调用PathMatchingResourcePatternResolver 的构造方法创建Spring 资源加载器:

public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {Assert.notNull(resourceLoader, "ResourceLoader must not be null");//设置Spring的资源加载器this.resourceLoader = resourceLoader;
}

在设置容器的资源加载器之后,接下来ClassPathXmlApplicationContext 执行setConfigLocations()方法通过调用其父类AbstractRefreshableConfigApplicationContext 的方法进行对Bean 配置信息的定位,该方法的源码如下:

/*** Set the config locations for this application context in init-param style,* i.e. with distinct locations separated by commas, semicolons or whitespace.* <p>If not set, the implementation may use a default as appropriate.*/
//处理单个资源文件路径为一个字符串的情况
public void setConfigLocation(String location) {//String CONFIG_LOCATION_DELIMITERS = ",; /t/n";//即多个资源文件路径之间用” ,; \t\n”分隔,解析成数组形式setConfigLocations(StringUtils.tokenizeToStringArray(location, CONFIG_LOCATION_DELIMITERS));
}/*** Set the config locations for this application context.* <p>If not set, the implementation may use a default as appropriate.*/
//解析Bean定义资源文件的路径,处理多个资源文件字符串数组
public void setConfigLocations(@Nullable String... locations) {if (locations != null) {Assert.noNullElements(locations, "Config locations must not be null");this.configLocations = new String[locations.length];for (int i = 0; i < locations.length; i++) {// resolvePath为同一个类中将字符串解析为路径的方法this.configLocations[i] = resolvePath(locations[i]).trim();}}else {this.configLocations = null;}
}

通过这两个方法的源码我们可以看出,我们既可以使用一个字符串来配置多个Spring Bean 配置信息,也可以使用字符串数组,即下面两种方式都是可以的:

ClassPathResource res = new ClassPathResource("a.xml,b.xml");

多个资源文件路径之间可以是用” , ; \t\n”等分隔。

ClassPathResource res =new ClassPathResource(new String[]{"a.xml","b.xml"});

至此,SpringIOC 容器在初始化时将配置的Bean 配置信息定位为Spring 封装的Resource。

基于Xml 的IOC 容器-获得配置路径相关推荐

  1. 基于Xml 的IOC 容器-载入配置路径

    AbstractRefreshableApplicationContext 中只定义了抽象的loadBeanDefinitions 方法,容器真正调用的是其子类AbstractXmlApplicati ...

  2. 基于Xml 的IOC 容器-将配置载入内存

    BeanDefinitionDocumentReader 接口通过registerBeanDefinitions() 方法调用其实现类DefaultBeanDefinitionDocumentRead ...

  3. 基于Xml 的IOC 容器-解析配置文件路径

    XmlBeanDefinitionReader 通过调用ClassPathXmlApplicationContext 的父类DefaultResourceLoader 的getResource()方法 ...

  4. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 基于Xml 的IOC 容器-分配路径处理策略

    在XmlBeanDefinitionReader 的抽象父类AbstractBeanDefinitionReader 中定义了载入过程. AbstractBeanDefinitionReader 的l ...

  6. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化

    IOC 容器的初始化包括 BeanDefinition 的 Resource 定位.加载和注册这三个基本的过程. 我们以ApplicationContext 为例讲解,ApplicationConte ...

  7. 基于Xml 的IOC 容器-载入<list>的子元素

    在BeanDefinitionParserDelegate 类中的parseListElement()方法就是具体实现解析<property>元素中的<list>集合子元素,源 ...

  8. 基于Xml 的IOC 容器-载入<bean>元素

    Bean 配置信息中的<import>和<alias>元素解析在DefaultBeanDefinitionDocumentReader 中已经完成,对Bean 配置信息中使用最 ...

  9. 基于Xml 的IOC 容器-分配解析策略

    XmlBeanDefinitionReader 类中的doLoadBeanDefinition()方法是从特定XML 文件中实际载入Bean 配置资源的方法,该方法在载入Bean 配置资源之后将其转换 ...

最新文章

  1. Visual Studio 编译任务压缩js和css文件
  2. nginx+php-fpm 的配置下,php的错误日志
  3. Airbnb欺诈预测机器学习模型设计:准确率和召回率的故事
  4. Linux通常把设备对象抽象为,linux 设备模型(1)
  5. linux命令中提取某一列,怎么用Linux命令提取表格文本中的某列
  6. php 安全基础 第七章 验证与授权 密码嗅探
  7. cocos2dx 3.x 蒙板 遮罩 点击圆功能
  8. 实现织梦dedecms百度主动推送(实时)网页抓取
  9. 信息学奥赛C++语言:找第一个只出现一次的字符
  10. Fedora 22 Linux 系统将于 7月 19日停止支持
  11. 不同内存区域的功能和特点
  12. 云图说|DRS数据对比——带您随时观测数据一致性
  13. 不同价格段用户购买手机关注的功能
  14. mysql索引的创建与管理实验_mysql索引创建与管理笔记
  15. Nginx基础详细讲解
  16. CentOS7增加或修改SSH端口号的方法
  17. mcu,单片机选型以及厂家推荐
  18. python艺术分形数_Python分形框计数 – 分形维数
  19. 3.2 基本数据类型
  20. 「圆桌」无人驾驶何时来?| 甲子引力

热门文章

  1. 文本分类-TensorRT优化结果对比图
  2. Dictionary里使用struct,enum做key
  3. 细数网络上十七种安全威胁
  4. ic designer
  5. modbus-tcp qt4-socket ---------micro2440 as device
  6. Struts 体系结构与工作原理(图)
  7. mysql 中模糊查询的四种用法介绍
  8. ORA-01810: 格式代码出现两次
  9. 【Hibernate】Hibernate实体关系映射——双边的一对一关系
  10. 《App后台开发运维与架构实践》第4章 Linux系统