# JefConfig **Repository Path**: chengzhi2/JefConfig ## Basic Information - **Project Name**: JefConfig - **Description**: 一种读取配置的工具,目前支持properties、yaml以及xml,无需导入任何第三方jar包,纯编码实现 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-11 - **Last Updated**: 2025-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JefConfig #### 前言 日常工作中不知道到大家有没有遇到以下几种情况: 1、在程序启动时需要加载配置文件,但是发现程序只能从固定位置读取配置文件。 2、程序在集成了spring框架后,想从配置文件中获取某个配置,但是发现当前程序并未交由spring管理,比如某个静态类中想要读取配置文件。 3、写了一个外挂程序想要快速的处理某个问题,但是需要读取配置文件,这时还有单独去写读取方法,而且写完之后还要考虑是否需要使用缓存。 #### 介绍 该项目提供多种配置文件读取方式,提供缓存功能,是一款轻量级的配置文件加载工具。目前支持propertis、xml和yaml配置文件读取。 使用方法: ①、在项目中创建jef.properties文件或yaml/xml文(工具默认读取资源文件夹下的jef.properties文件)。 ②、创建自定义Enum类实现ConfigItem接口,定义自己的属性。 ③、使用JefConfiguration.get(xxx)获取 ④、支持自定义文件名:VM启动参数中添加-Djef.properties=file:///C:xxx\\xx\\xxx.properties或者-Djef.properties=file:///D:xx\\xx\\xxx.yaml 来指定自己的配置文件或者使用System.setProperty(xxx)来设置 ⑤、支持标准文件协议,例如获取指定路径下的文件 System.setProperty("jef.properties","file:///D:\\Java\\JavaSource\\JefConfig\\src\\test\\java\\testdDir\\my.properties"); #### 使用示例 **自定义Enum类** ```java import ConfigItem; public enum TestItem implements ConfigItem { TEST_ITEM, TEST_CODE } ``` jef.properties配置示例(系统默认分隔符为"="或者":",如果一行中两者都存在,则默认使用第一次出现的分隔符做为本行的分隔符) ```properties # 系统注释符号为"#"和"!" test.item:999988 # 该条配置将使用=做为分割符号 db.url=jdbc:mysql://127.0.0.1:3306/test !该条配置将使用:做为分隔符 db.type:mysql=1 ``` jef.yaml配置示例 ```yaml db: url: jdbc:oracle:thin:@(DESCRIPTION =(FAILOVER = ON)(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 126.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = shzw)))) type: test server: port: 9000 tomcat: uri-encoding: UTF-8 jetty: max-http-post-size: 104857600 max-http-form-post-size: 104857600 servlet: session: cookie: name: "HSESSIONID" ``` jef.xml配置示例(目前暂时不支持读取Attribute中的配置,框架会自动忽略根节点) ``` jdbc:mysql://127.0.0.1:3306/postgirl cz 127.0.0.1 9999 ``` 获取自定义配置: 示例1:读取默认配置jef.prperties ```java import JefConfiguration; public class Main { public static void main(String[] args) { String s = JefConfiguration.get(TestItem.TEST_ITEM); System.out.println(s); } } ``` 示例2:编码式读取自定义配置 ```java import JefConfiguration; public class Main { public static void main(String[] args) { System.setProperty("jef.properties", "file:///D:\\Java\\JavaSource\\JefConfig\\src\\test\\java\\testdDir\\test.yaml"); String s = JefConfiguration.get(TestItem.TEST_ITEM); System.out.println(s); } } ``` 示例3:运行时读取自定义配置 jvm启动参数中添加配置:-Djef.properties=file:///D:\\Java\\JavaSource\\JefConfig\\src\\test\\java\\testdDir\\test.yaml ```java import JefConfiguration; public class Main { public static void main(String[] args) { String s = JefConfiguration.get(TestItem.TEST_ITEM); System.out.println(s); } } ``` 效果: ![输入图片说明](https://images.gitee.com/uploads/images/2022/0715/181018_21f5375a_5396518.png "屏幕截图.png") #### 为什么要自定义配置读取工具 一、JDK自带的Properties使用时的不便之处: 1、在遍历时,由于Properties继承了Map<Object,Object>泛型,不得不编写强制类型转换的代码。 2、Properties继承了Hashtable性能低下,此外如果getProperty(null)还会抛出异常。 3、Properties中的数据是乱序的,无法保持原先在文件中出现的顺序 4、Properties保留了基于InputStream的接口,使用时容易出现编码错误 二、自己实现yaml解析器的好处: 1、yaml的解析不管是springboot中的自带的还是其他框架提供的,都是使用第三方jar包(jyaml.jar、snakeyaml.jar等)来解析的,因此如果我也使用该方式读取,那么用户在集成使用的时候可能会引起jar包冲突。 2、由于该工具只是做为解析配置文件,因此不需要实现yaml的复杂语法解析,更轻量,更实用。 三、自动配置工具天然支持缓存,不需要额外去配置。 四、jefConfig支持JMX监控并提供了动态修改配置接口,后续还会接入web页面来管理配置内容,同时还考虑兼容apollo和Disconf协议,让jefConfig也可以兼容分布式配置。 1、使用jconsole工具(jdk1.8\date\bin)连接java进程,点击JefConfigMonitor来查看和管理配置 ![jconsole](img/view.png) 2、动态修改配置,可以修改现有配置或者增加新配置,提供了两个方法,一个用来更新SystemProperties,另一个用来更新jefconfig, ![jconsole](img/update.png) 3、动态调整配置成功示例: ![jconsole](img/updateSucc.png) #### 联系方式 QQ:1803472613
邮箱:1803472613@qq.com
欢迎大家和我一起创造一个方便快捷的工具。