SpringBoot外化配置源码解析:命令参数获取文件加载( 三 )


并且在 Loader 的构造方法中通过 SpringFactoriesLoader 的 IoadFactories 方法来获得 。
# PropertySource 加载器配置org. springframework. boot . env . PropertySourceLoader=\org. springframework . boot . env . PropertiesPropertySourceLoader, \org. springframework . boot . env. YamlPropertySourceLoader当查看 PropertiesPropertySourceLoader 和 YamlPropertySourceLoader 两个加载器代码 , 就会发现它们分别定义了所支持文件类型及其加载方法 。 PropertiesPropertySourceL oader支持配置文件类型的定义代码如下 。
public class PropertiesPropertySourceLoader implements PropertySourceLoaderprivate static final String XML_ FILE_ EXTENSION =”.xml";@Overridepublic String[] getFileExtensions()}}return new String[] { " properties", "xml"YamlPropertySourceLoader 支持配置文件类型的定义代码如下 。 public class YamlPropertySourceLoader implements PropertySourceLoader {@Overridepublic String[] getFileExtensions() {return new String[] { "yml", "yaml" }.}}其中 PropertiesPropertySourceLoader 对文件的加载通过 PropertiesLoaderUtils 类( 加载xml 文件)和 OriginTrackedPropertiesL oader 类来完成 , 而 YamlPropertySourceLoader 对文件的加载主要通过 OriginTrackedYamIL oader 来完成 。
【SpringBoot外化配置源码解析:命令参数获取文件加载】下面以 PropertiesPropertySourceLoader 使用的 OriginTrackedPropertiesL oader 为例进行源码分析 。
PropertiesPropertySourceLoader 中加载相关的代码如下 。
public class PropertiesPropertySourceLoader implements PropertySourceLoader//加载指定的配置文件@Overridepublic List> load(String name, Resource resource) throwsIOException {//调用 load 方法进 行加载并返@Map 形式的数据Map properties = loadProperties(resource);if (properties . isEmpty()) {return Collections. emptyList();//对返回结果进行处理和转换return Collections. singletonList(new OriginTrackedMapPropertySource(name,Collections . unmodifiableMap(properties) , true));//具体加裁过程@SuppressWarnings({ "unchecked", "rawtypes" })private Map loadProperties(Resource resource) throws IOExceptionString filename = resource . getFilename();//加载 xmL 格式if (filename != null //加戴 properties 格式return new OriginTrackedPropertiesLoader(resource). load();}}我们一起看以上代码中 properties 格式的加载 , 也就是最后一行代码的业务逻辑实现 。 这里创 建 了 OriginTrackedPropertiesLoader 对 象 并 调 用 了 其 load 方 法。
OriginTrackedPropertiesLoader 的构造方法非常简单 , 只是把 resource 预置给其成员变量Resource resource 。
再来重点看 load 方法的实现 , 代码如下 。
class OriginTrackedPropertiesLoader {private final Resource resource;/*** Load {@code . properties} data and return a map of {@code String} - >* {@Link OriginTrackedValue}.@param expandLists if list {@code name[]=a,b,c} shortcuts should beexpanded@return the Loaded properties@throws IOException on read error*///加戴 properties 文件的数据并返 Emap 类型//其中 expandLists 用于指定参数为"name[]=a, b,c"的列表是否进行扩展 , 默 itrueMap load(boolean expandLists) throws IOException {//创建配置文件的 readertry (CharacterReader reader = new CharacterReader(this . resource)) {Map result = new LinkedHashMap<>();StringBuilder buffer = new StringBuilder();//读取文件中的数据while (reader .read()) {//读取文件中的 keyString key = loadKey(buffer, reader). trim();/可扩展列表的处理if (expandLists int index = 0do {OriginTrackedValue value = http://kandian.youth.cn/index/loadValue(buffer, reader, true);put(result, key +"[" + (index++) + "]" , value);if (!reader. isEndofLine()){reader . read();}while (!reader . isEndOfLine());} else//读取文件中 value 并封装为 OriginTrackedValueOriginTrackedValue value = http://kandian.youth.cn/index/loadValue(buffer, reader, false);put(result, key, value);return result;}}以上代码展示了 OriginTrackedPropertiesL oader 的 load 方法的核心功能:创建 reader 读取配置文件、获得配置文件中配置的 key、 获取配置文件中的 value、封装 key-value 到 map中并返回 。
关于 loadKey、loadValue 的操作无非就是字符串按照指定格式的解析 , 具体实现都在该类内部 , 就不附上代码了 。
本节以 properties 类型的配置文件为例讲解了其解析加载过程是如何进行的 , 其他类型的操作过程基本一致 , 只不过不同文件的具体解析方式有所不同 。 因此 , 关于其他类型的代码解析就不在此深入拓展了 , 感兴趣的读者可以继续查看这两个类的其他源码进行了解 。
本文给大家讲解的内容是命令参数的获取和配置文件的加载

  1. 下篇文章给大家讲解的是基于Profile的处理实现;
  2. 觉得文章不错的朋友可以转发此文关注小编;