Simple Configuration Facade, 简写为 SCF。是 代码 和 外部配置 (properties文件, 环境变量,系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命名上和另一个著名组件slf4j (Simple Logging Facade for Java)相似, 在配置领域的地位也和slf4j (.NET可类比NLog)在日志领域的地位相同。

SCF使得代码和外部配置分离。代码使用一个配置项,无需关心配置项在哪里配置,如何配置。

用法

  • java: https://github.com/mydotey/scf/tree/master/java
  • dotnet: https://github.com/mydotey/scf/tree/master/dotnet

示例

https://github.com/mydotey/scf-best-practice

功能

强类型

核心抽象是强类型的Property, Key和Value都是强类型。

安全的配置

可以通过1个value filter来自动检查外部配置的正确性。

动态配置

配置可以是动态变化的。配置项的值自动更新。用户也可添加Listener监听配置项的变化。

多配置源

多个配置源有不同的优先级。配置项的值按配置源的优先级自动计算。

可扩展

scf-core 里只定义了一组接口抽象和默认实现。所有核心概念都是可扩展的(配置管理器,配置源,配置项等等)。用户可以自由地对默认实现进行扩展,或者编写自己的实现。

一些常用扩展:

  • scf-simple
  • scf-labeled
  • scf-yaml
  • scf-apollo

轻量

无线程使用,只使用少量内存来缓存配置项。

支持多线程并发

Manager/Property的方法都是线程安全的,可以多线程并发使用。时间复杂读为O(1),和ConcurrentHashMap相同。

容易使用

scf-simple 对最简单常用的Property场景进行了实现: properties file, memory Map, system properties, env variables.

参考:

  • 用法
  • 示例

核心概念

配置项(Property)

配置项是可以在代码里独立使用的配置单元,有1个唯一的Property Config和1个强类型值。

代码可以监听配置项的动态变化。配置项的值由配置管理器(Configuration Manager)自动更新。

配置项配置(Property Config)

配置项配置具有以下组成部分:

  • Key: 在1个配置管理器里唯一标识1个配置项。最常见的类型是String,也可以是其它强类型的对象。
  • Value Type: 配置项的值的类型。
  • Default Value: 配置项的默认值。如果配置项在任何配置源里都没有配,使用此默认配置。
  • Value Converter: 值转换器。把1个类型的值转换为另1个类型的值。比如1个配置源里有配置项,但代码需要的配置是,值转换器可以自动地把V1的值转为V2的值。
  • Value Filter: 值过滤器。主要用于检查配置源里取到的值的有效性。
  • Value Comparator: 值比较器。用于比较配置项的值是否有变化。默认使用值的Equals方法进行比较。

配置源(Configuration Source)

1个配置项可以以多种形式来进行配置。例如内存字典、properties文件、环境变量、命令行参数、yaml文件等等。

多种配置方式可以一起使用。每种配置方式是1个配置源。配置源负责对配置项提供值。

有时1个配置源无法向某个配置项提供值,提供null(认为没有配置此配置项)。

  • 配置项的Key无法被配置源识别。如key是1个强类型的对象{ key: request.timeout, labels: { dc: aws-us-east1, app: 100000 } }, 但是配置源只接受String类型的key。
  • 配置项在配置源里没有配置。
  • 配置项在配置源里的值是类型A,但代码里需要类型B,PropertyConfig没有值转换器可以把类型A转为类型B,配置源也无法自动把A转换为B。

配置管理器(Configuration Manager)

配置管理器是代码外部配置间的门面。代码配置管理器获取配置项,不关心配置项在哪里配置,如何配置。

1个程序里可以只使用1个配置管理器,也可以使用多个不同的管理器。不同的组件可以使用不同的配置管理器,配置管理器也可以在不同组件间共享/传递。

配置管理器提供2个Api:

  • Property getProperty(PropertyConfig config): 用于具有 稳定 的Key的 稳定 的配置项,返回1个 唯一 的配置项。 配置管理器 保持这个配置项,自动更新配置值,通知配置监听器配置项的变化。 代码 可以保持获得的配置项,多次重复使用。
  • V getPropertyValue(PropertyConfig config): 用于具有 不稳定 的Key的 不稳定 的配置项。例如, 访问者 IP 作为配置项Key的一部分, 不确定程序里有多少配置项,不确定哪个配置项会被配置,何时会被配置。

配置源和配置优先级

1个配置管理器可以管理多个配置源, 不同的配置源具有不同的优先级 。配置管理器按优先级从配置源获取配置值。

核心概念间的关系

核心逻辑

java配环境变量_用于 Java 开发的配置工具 Simple Configuration Facade相关推荐

  1. java设置系统环境变量_设置java 环境变量

    DOS下任意目录用JAVA,JAVAC肯定是显示正确咯,因为你设置好了JAVAlib和bin的但是JAVA文件需要DOS下CD好了目录才能JAVAC否则是在C:\program里查找该JAVA文件你任 ...

  2. java freemind_java环境变量的应用:为Freemind配置Java环境

    [java环境变量的运用]本文要分享的是java环境变量在FreeMind的应用,言外之意就是为FreeMind配置java环境,好的,那我们开始正题.安装并检查Java运行环境. FreeMind需 ...

  3. 添加java环境变量_【安装 JDK】 配置环境变量

    看完这章后你会学习到以下内容: WIN64位电脑,如何配置JAVA环境? 常见的问题要如何解决? 第一步: 在任意浏览器输入"JDK下载"并找到官网 第二步:进入选择所需要的版本. ...

  4. 安装java 并配置环境变量_安装Java JDK并配置环境变量

    学习JAVA,必须得安装一下JDK(java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程: 点开链接你应该看到如下图所示的界面 ...

  5. Java基础-环境变量设置及Java命令行使用

    2019独角兽企业重金招聘Python工程师标准>>> 一.Java环境变量设置 windows 下配置JDK环境变量: 1. 安装JDK,安装过程中可以自定义安装目录等信息,例如我 ...

  6. java设置环境变量win7_Windows7系统配置java环境变量的详细教程

    作为java运行环境支撑,任何一个java开发人员都必须学会安装jdk以及java环境变量的配置.有用户询问小编win7系统配置java环境变量会难?其实只要掌握方法,就可以得心应手了.接下来小编向大 ...

  7. java后台环境搭建_后端-java环境搭建

    java环境搭建 开发工具:idea/eclipse/myeclipse + mysql/oracle/sqlserver/postgresql + tomcat6/7/8/9. 下面以eclipse ...

  8. java 易变变量_关于java:易变变量和其他变量

    以下是经典Concurency in Practice的内容: When thread A writes to a volatile variable and subsequently thread ...

  9. java 易变变量_提高java编程质量 - (一)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型: 2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务 3.简单:脚本语言语 ...

  10. java string hash变量_聊聊 Java 中 HashMap 初始化的另一种方式

    如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一 ...

最新文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程
  2. 各种卡的一些信息积累
  3. c++求区间第k大数_数组中求第K大数的实现方法
  4. 认知无线电matlab代码详解,认知无线电频谱感知之功率检测matlab代码.docx
  5. windows下同时安装python2与python3
  6. 使用Symantec Altiris 来监控 Dell 服务器 的 硬件
  7. Win7蓝屏代码0x000000001e怎么解决
  8. VGG网络结构(二)
  9. 10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版...
  10. 实时--1.1 日志数据分析
  11. 如何算三角形的cotangent
  12. centos6使用docker部署zookeeper
  13. [WebView五学习]:调试Web Apps
  14. samba服务器之无认证进入共享目录
  15. Caffe框架-入门浅谈及碰到的坑
  16. 雷曼兄弟 算法_雷曼如何失去双腿
  17. 做微商的朋友们都想知道代购怎么在闲鱼上引流?
  18. pycharm将计算出来的数据导入进数据库MYSQL
  19. JAVA_02 j2se j2ee j2me jse jee jme
  20. 什么才是靠谱的企业新媒体运营流程

热门文章

  1. disruptor:CAS实现高效(伪)无锁阻塞队列实践
  2. 更改win7脱机文件夹位置
  3. Windows任务管理器
  4. 深入 Java 调试体系: 第 1 部分,JPDA 体系概览
  5. 【正则】正则表达式基础知识大全
  6. 各位有没有遇到过这样的问题?
  7. 如何自己实现一个缓存服务
  8. idea添加maven启动
  9. 实现二级菜单的滑动出现与消失(解决dispaly与transition冲突问题)
  10. mysql 存储过程 获取错误信息 继续执行