SpringBoot外化配置源码解析:Profile处理实现( 二 )


private void load(Profile profile, DocumentFilterFactory filterFactory,DocumentConsumer consumer)getSearchLocat ions(). forEach( (location) -> {boolean isFolder = location endsWith("/");Set names = isFolder ? getSearchNames() : NO_ SEARCH_ NAMES;names . forEach((name) -> load(location, name, profile, filterFactory, consumer));}在上面的代码中 , 主要通过 getSearchL ocations 方法获得默认的扫描路径 , 如果没有特殊指 定,就 采 用 常 量 DEFAULT_ SEARCH_ LOCATIONS中定义的4个路 径。而getSearchNames 方 法获得的就是 application 这个默认的配置文件名 。 然后 , 逐一遍历加载目录路径及其指定文件名的文件 。
当扫描到符合条件的文件时程序会进行相应的解析操作 , 比如我们将指定 active 的配置放在默认的配置文件中 , 那么第一轮 for 循环就会将该 参数读取出来 , 并添加到 profiles 中 , 并且把 profile 中的 default 配置项移除 。
private void load(PropertySourceLoader loader, String location, Profile prafile,DocumentFilter filter, DocumentConsumer consumer) {try {List loaded = new ArrayList<>();for (Document document : documents) {f (filter .match(document))addActiveProfiles (document . getActiveProfiles());addInc ludedProfiles (document . getIncludeProfiles());loaded . add(document);}}catch (Exception ex) {}}重点看上面代码中 for 循环的操作 , 如果解析配置文件中获得 profile 的配置项 , 会对这些配置项进行再次处理 , 也就是调用 addActiveProfiles 方法 。 addActiveProfiles 方法的代码如下 。
void addActiveProfiles(Set profiles) {//如果未经激活则将其添加到 profiles 队列中this . profiles . addAll(profiles);if (this . logger. isDebugEnabled()) {this. logger. debug("Activated activeProfiles+ StringUtils. collectionToCommaDelimitedString(profiles));// profile 设置被激活this . activatedProfiles = true;//移除未处理的默 profileremoveUnprocessedDefaultProfiles();}这里会将配置文件中获得的 profile 添加到 profiles 中去 , 并设置 profile 为激活状态 。 最后 , 再调用 removeUnprocessedDefaultProfiles 方 法将默认值移除 。 很显然 , 既然已经获得了指定的 profile 配置,那么程序自动设置的默认值也就失效了 。
最后再看一下 load 方法 中 add oadedPropertySources 方法 , 该方法将加载的配置文件有序地设置到环境中 。 而配置文件有序性也是通过 loaded 的数据结构来实现的 , 在初始化的时候已经看到它是一个 LinkedHashMap 。
【SpringBoot外化配置源码解析:Profile处理实现】private void addL oadedPropertySources() {MutablePropertySources destination = this . environment. getPropertySources();List loaded = new ArrayL ist<>(this. loaded. values());//倒序 , 后指定的 profile 在前面Collections. reverse(loaded) ;String lastAdded = null;Set added = new HashSet<>( );for (MutablePropertySources sources : loaded) {for (PropertySource source : sources) {if (added. add(source . getName())) {addLoadedPropertySource( destination, lastAdded, source);lastAdded = source . getName();}}}}一般情况 下 loaded 属性中会存储两个 MutablePropertySources, -一个为默认的 , 一个为通过 active 指定的 , 而 MutablePropertySources 中又存储着 属性配置文件的路径列表 。
通过上面的双层遍历会获得默认的属性配置文件和指定的属性配置文件 , 同时将它们添加到环境中去 。
这里我们从整体了解了 Profile 的操作流程 , 上一 节中已经举例讲解配置文件的解析、加载等过程 , 不在此赘述 。
SpringBoot外化配置源码解析:Profile处理实现文章插图
本文给大家讲解的内容是SpringBoot外化配置源码解析基于Profile 的处理实现

  1. 下篇文章给大家讲解的是SpringBoot外化配置源码解析综合实战;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!