Spring源代码分析:PropertiesLoaderSupport
概述
Spring PropertiesLoaderSupport是一个抽象基类,它抽象了从不同渠道加载属性的通用逻辑,以及这些属性应用优先级上的一些考虑。它所提供的这些功能主要供实现子类使用。Spring框架中,PropertiesLoaderSupport的实现子类有PropertiesFactoryBean,PropertyResourceConfigurer等。
首先,它将属性分成两类:本地属性(也叫缺省属性)和外来属性。这里本地属性指的是直接以Properties对象形式设置进来的属性。外来属性指的是通过外部资源形式设置进来需要加载的那些属性。
然后,对于本地属性和外来属性之间的的使用优先级,PropertiesLoaderSupport通过属性localOverride来标识。如果localOverride为false,表示外部属性优先级高,这也是缺省设置。如果localOverride为true,表示本地属性优先级高。
另外,PropertiesLoaderSupport还有一个属性fileEncoding用来表示从属性文件加载属性时使用的字符集。
PropertiesLoaderSupport 所在包 : org.springframework.core.io.support 。
源代码解析
属性定义
// 本地属性,通过设置Properties对象直接设置进来的属性
@Nullable
protected Properties[] localProperties; // 本地属性和外来属性之间的优先级,或者叫做覆盖关系
// false 表示 外来属性优先级高于本地属性 (缺省值)
// true 表示 本地属性优先级高于外来属性
protected boolean localOverride = false; // 外来属性对应资源,通过设置外部资源位置设置进来需要加载的属性
@Nullable
private Resource[] locations; // 读取外来属性时遇到不存在的资源路径应该怎么办 ?
// false : 输出一个日志,然后继续执行其他逻辑 (缺省值)
// true : 抛出异常
private boolean ignoreResourceNotFound = false; // 加载外来属性资源文件时使用的字符集
@Nullable
private String fileEncoding; // 外来属性加载工具
private PropertiesPersister propertiesPersister = new DefaultPropertiesPersister();
对于上述属性,PropertiesLoaderSupport
都提供了相应的set
方法。
主要功能方法
mergeProperties
合并本地属性和外来属性然后返回一个Properties
对象,这里面考虑了属性 localOverride
的应用。
/**
* Return a merged Properties instance containing both the
* loaded properties and properties set on this FactoryBean.
*
*/
protected Properties mergeProperties() throws IOException {
Properties result = new Properties(); if (this.localOverride) {
// Load properties from file upfront, to let local properties override.
// localOverride == true, 先加载外来属性到结果对象
loadProperties(result);
} if (this.localProperties != null) {
// 将本地属性合并到结果对象
for (Properties localProp : this.localProperties) {
CollectionUtils.mergePropertiesIntoMap(localProp, result);
}
} if (!this.localOverride) {
// Load properties from file afterwards, to let those properties override.
// localOverride == false, 后加载外来属性到结果对象
loadProperties(result);
} return result;
}
loadProperties
外部属性的加载方法。
/**
* Load properties into the given instance.
* @param props the Properties instance to load into
* @throws IOException in case of I/O errors
* @see #setLocations
*/
protected void loadProperties(Properties props) throws IOException {
if (this.locations != null) {
// 读取每一个属性文件资源
for (Resource location : this.locations) {
if (logger.isTraceEnabled()) {
logger.trace("Loading properties file from " + location);
}
try {
// 使用指定的字符集fileEncoding从外部资源路径location读取属性到props,使用的属性读取工具
// 是 propertiesPersister
PropertiesLoaderUtils.fillProperties(
props, new EncodedResource(location, this.fileEncoding), this.propertiesPersister);
}
catch (FileNotFoundException | UnknownHostException ex) {
// 出现异常时,如果ignoreResourceNotFound==true,则仅仅记录日志,继续读取下一个
// 资源文件,否则直接抛出该异常
if (this.ignoreResourceNotFound) {
if (logger.isDebugEnabled()) {
logger.debug("Properties resource not found: " + ex.getMessage());
}
}
else {
throw ex;
}
}
}
}
}
总结
从上面分析可以看出,PropertiesLoaderSupport所实现的功能并不多,主要是设置要使用的本地属性和外部属性文件资源路径,最终通过mergeProperties方法将这些属性合并成一个Properties对象,本地属性和外部属性之间的优先级关系由属性localOverride决定。
————————————————
版权声明:本文为CSDN博主「安迪源文」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/andy_zhang2007/article/details/86749301
Spring源代码分析:PropertiesLoaderSupport的更多相关文章
- 【spring源代码分析】--Bean的解析与注冊
接着上一节继续分析,DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法: protected void parseBeanDefini ...
- spring源代码分析
预初始化beanDefaultListableBeanFactory preInstantiateSingletons
- 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析
刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...
- Mybatis结合Spring注解自己主动扫描源代码分析
作为一个想做架构师的程序猿,必须是一个优秀的程序猿.在引入某一个框架的时候,必需要研究源代码,将新的开源框架的风险变为可控性. 1.Spring结合Mybatis最经常使用的配置. <!--理论 ...
- 看透Spring MVC:源代码分析与实践 (Web开发技术丛书)
第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 1 ...
- MyBatis架构设计及源代码分析系列(一):MyBatis架构
如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...
- SpringMVC 之类型转换Converter 源代码分析
SpringMVC 之类型转换Converter 源代码分析 最近研究SpringMVC的类型转换器,在以往我们需要 SpringMVC 为我们自动进行类型转换的时候都是用的PropertyEdito ...
- MyBatis整合Spring原理分析
目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
随机推荐
- Python中闭包的原理
定义: 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 简单闭包的例子: 下面是一个使用闭包简单的例子,模拟一个计数器,通过将 ...
- MySql数据库操作之数据约束
首先数据库的外键是数据库提供的一种完整性约束.在许多数据库的书上也会介绍到,然而对于外键这个完整性性约束究竟应该在数据库端实现,还是在项目业务端实现很多人有着不同的意见. 个人开发(小型应用).数据库 ...
- Java 之 字符流
一.字符流 当使用字节读取文本文件时,可能会有一个小问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以 Java 提供了一些字符类,以字符为单位读写数据, ...
- linux sort命令用法
sort命令:用于将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 命令格式: sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符> ...
- CSS之简介及引入方式
一.css的来源 1994年哈坤·利提出了CSS的最初建议.而当时伯特·波斯(Bert Bos)正在设计一个名为Argo的浏览器,于是他们决定一起设计CSS.其实当时在互联网界已经有过一些统一样式表语 ...
- Linux中安装配置启动关闭nginx等一系列动作
Nginx简介 1.Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器: 2.Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的 ...
- Jfinal事务操作
添加删除更新均可用以下事务 import java.sql.Connection; import java.sql.SQLException; import com.jfinal.plugin.act ...
- Vim使用技巧(0) -- 博主的vim配置
vim ~/.vimrc "插入模式时 光标的上下左右移动 inoremap <C-l> <Right> inoremap <C-h> <Left& ...
- Jmeter性能测试NoHttpResponseException (the target server failed to respond)
采用JMeter做Http性能测试时,在高并发请求的情况下,服务器端并无异常,但是Jmeter端报错NoHttpResponseException (the target server failed ...
- Java8新特性--日期和时间API
如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...