高效的配置文件读取工具支持properties和yaml

news2025/1/14 18:43:51

JefConfig

前言

日常工作中不知道到大家有没有遇到以下几种情况:
1、在程序启动时需要加载配置文件,但是发现程序只能从固定位置读取配置文件。
2、程序在集成了spring框架后,想从配置文件中获取某个配置,但是发现当前程序并未交由spring管理,比如某个静态类中想要读取配置文件。
3、写了一个外挂程序想要快速的处理某个问题,但是需要读取配置文件,这时还有单独去写读取方法,而且写完之后还要考虑是否需要使用缓存。

介绍

该项目提供多种配置文件读取方式,提供缓存功能,是一款轻量级的配置文件加载工具。目前支持propertis和yaml配置文件读取。

使用方法:
    ①、在项目中创建jef.properties文件(工具默认读取资源文件夹下的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类

import pers.cz.config.ConfigItem;

public enum TestItem implements ConfigItem {

    TEST_ITEM,
    TEST_CODE
}

jef.properties配置示例(系统默认分隔符为"=“或者”:",如果一行中两者都存在,则默认使用第一次出现的分隔符做为本行的分隔符)

# 系统注释符号为"#"和"!"
test.item:999988
# 该条配置将使用=做为分割符号
db.url=jdbc:mysql://127.0.0.1:3306/test
!该条配置将使用:做为分隔符
db.type:mysql=1

jef.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"

获取自定义配置:
示例1:读取默认配置jef.prperties

import pers.cz.config.JefConfiguration;

public class Main {

    public static void main(String[] args) {
        String s = JefConfiguration.get(TestItem.TEST_ITEM);
        System.out.println(s);
    }
}

示例2:编码式读取自定义配置

import pers.cz.config.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

import pers.cz.config.JefConfiguration;

public class Main {

    public static void main(String[] args) {
        String s = JefConfiguration.get(TestItem.TEST_ITEM);
        System.out.println(s);
    }
}

效果:

image.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的复杂语法解析,更轻量,更实用。

三、自动配置工具天然支持缓存,不需要额外去配置。

项目地址:

https://gitee.com/chengzhi2/JefConfig

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并查集原理及代码实现

并查集 首先要明确的是并查集是森林。由多棵树组成。 并查集 (英文:Disjoint-set data structure,直译为不交集数据结构),用于处理一些 不交集 (Disjoint sets,一系列没有重复元素的集合&…

android framework-SystemServer进程

SystemServer进程信息 一、SystemServer整体时序图 涉及源码路径: android-10.0.0_r41\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java android-10.0.0_r41\frameworks\base\core\java\com\android\internal\os\Zygote.java android-10.0.0_r4…

JAVAWeb07-WEB 开发通信协议-HTTP 协议-关联篇

1. 概述 1.1 官方文档及示例说明 1.1.1 请求头 1.1.2 响应头 1.1.3 HTTP 响应状态码 HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头&a…

leetcode 1372. Longest ZigZag Path in a Binary Tree(二叉树中最长的之字形路径)

找出最长的之字型路径长度。 可以选择从二叉树的任意一个节点出发。 路径长度为路径中的节点数-1. 思路: 符合DFS的特征。 方向是左右交替的,可以定义0,1两个方向。 如果当前方向是左,下一方向就是右,反之亦然。每次…

FinClip|小程序云开发的那点事儿

在开发一个小程序时,除了考虑界面功能逻辑外,还需要后端的数据支持,开发者需要提前考虑服务器、存储和数据库等相关需求的支持能力,此外还可能需要花费时间精力在部署应用、和依赖服务的建设上。 因此,微信小程序为了…

dolphinscheduler3.1.3版本代码编译运行方法

说明 该文档适用于dolphinscheduler 3.1.3-release版本。 一 环境准备 需要使用的环境包括JDK1.8,以及Maven 3.6以上的版本,这里使用低于3.6版本的Maven也可以调试运行,不过在打包的时候会有报错,最好使用高版本的maven。 二 …

数字IC笔试面试常考问题及答案汇总(内含各岗位大厂题目)

经历了无数的笔试面试之后,不知道大家有没有发现数字IC的笔试面试还是有很多共通之处和规律可循的。所以一定要掌握笔试面试常考的问题。 数字IC笔试面试常考问题及答案汇总(文末可领全部哦~) 验证方向(部分题目) Q1…

android studio APP工程的项目结构说明及创建

目录 1.APP工程的项目结构图 2.功能说明 2.1app 2.2Gradle Scripts 3.创建新的APP页面 补充: 1.APP工程的项目结构图 2.功能说明 该项目下两个分类:一个是app(代表app模块);另一个是Gradle Scripts。 2.1app app下面有3个…

虚拟机安装Centos7,ping不通百度

虚拟机安装Centos7,ping不通百度 一、虚拟机网络配置 网络适配器选择桥接模式,不勾选复制物理网络连接状态。 同时虚拟机使用默认配置都是桥接。 二、配置静态IP 1、首先,查看宿主机的IP和网关 2、配置静态ip的文件地址及修改命令如下&…

mybatis分页插件的基本理解和使用

mybatis分页插件的基本理解和使用 为什么要使用mybatis分页插件? 分页是一种将所有数据分段展示给用户的技术。用户每次看到的不是全部数据,而是其中一部分,如果在其中没有找到自己想要的内容,用户可以通过制定页码或者是翻页的…

就业并想要长期发展选数字后端还是ic验证?

“就业并想要长期发展选数字后端还是ic验证?” 这是知乎上的一个热点问题,浏览量达到了13,183。看来有不少同学对这个问题感到疑惑。之前更新了数字后端&数字验证的诸多文章,从学习到职业发展,都写过,唯一没有做过…

CRM系统能帮助企业解决哪些问题?

随着信息化技术的不断发展和全球化的推进,市场竞争越来越激烈,客户需求也在不断变化。为了应对这种情况,越来越多的企业开始使用CRM系统来管理与客户的关系。那么,CRM系统到底解决了企业哪些问题呢? 一、提高客户满意…

亿发软件:传统食品饮料批发行业如何通过信息化管理系统降本增效?

传统食品饮料批发行业信息化水平较低,存在多重管理难题,例如: 手动数据输入和管理,导致错误和效率低下; 数据缺乏实时可见性,无法实时了解企业仓库存量、销售额和其他关键业务指标; 低效的供应链…

【Android】之【常用布局】

一、简介 Android常用布局分别是 1、线性布局LinearLayout 2、相对布局RelativeLayout 3、绝对布局AbsoluteLayout 4、帧布局FrameLayout 5、表格布局TableLayout 6、网格布局GridLayout 7、约束布局ConstraintLayout 二、详解 2.1. LinearLayout (线性布局) 线性布局是一种非…

Rabbit与springboot整合-1

目录 1、整体结构 2、pom引入 3、配置文件 4、代码 公共类 controller类 JSON转换类 监听-接收发送消息类 1、整体结构 2、pom引入 <!--rabbitmq--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…

C++引用与引用两大应用场景,临时变量的常性,常引用与权限大小问题

tips 内存栈区的用习惯是先使用高地址&#xff0c;然后使用低地址嘛顺序表数组支持随机下标访问&#xff0c;也是目前已知的仅有的数据结构类当中的话&#xff0c;它不可以不仅可以去定义变量&#xff0c;它也可以定义函数&#xff0c;这个跟c当中的结构体不一样的&#xff0c…

数据结构考研版——队列的配置问题

一、正常配置下的情况 队空状态 frontrear;入队操作 出队操作 队满状态 在正常配置下元素的个数&#xff08;rear>front&#xff09; 当rear<front 综上所述用一个表达式表示&#xff1a;(rear-frontmaxSize)%maxSize 二、非正常配置下的情况1 队空状态 入队操作…

Stable Diffusion-webUI ckpt模型、lora模型的区别和使用

一、常用的两种模型&#xff1a;ckpt和Lora分别是什么&#xff1f;有什么区别&#xff1f; 1、CKPT&#xff08;CheckPoint&#xff09; 经过训练的图片合集&#xff0c;被称作模型&#xff0c;也就是chekpoint&#xff0c;体积较大&#xff0c;一般真人版的单个模型的大小在…

StarRC的妙用

在整个R2G的流程里边&#xff0c;寄生参数抽取&#xff08;StarRC&#xff09;是比较没有存在感的。大部分的时间&#xff0c;工程师们只是用这个工具来刷SPEF。并不会关注太多。这本身其实是一个好事情&#xff0c;反向证明了参数抽取工具的高度稳定性&#xff01; 但是&#…

虚拟数字人的3种驱动方式

虚拟数字人是由计算机程序所构建的具有人类特征的虚拟实体&#xff0c;目前的虚拟数字人经过了三代的更迭&#xff0c;划分每一代更迭的标准则是虚拟数字人的驱动方式。 一、虚拟数字人1.0&#xff1a;动画&CG驱动 虚拟数字人1.0就是目前我们所熟知的&#xff0c;比如&am…