java property配置文件管理工具框架过程详解
作者:叶止水 发布时间:2023-10-12 04:35:50
这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
property
property 是 java 实现的 property 框架。
特点
优雅地进行属性文件的读取和更新
写入属性文件后属性不乱序
灵活定义编码信息
使用 OO 的方式操作 property 文件
支持多级对象引用
快速开始
环境依赖
Maven 3.x
Jdk 1.7+
Maven 引入依赖
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>property</artifactId>
<version>0.0.4</version>
</dependency>
入门案例
读取属性
PropertyBs.getInstance("read.properties").get("hello");
read.properties 为文件路径,hello 为存在的属性值名称。
读取属性指定默认值
final String value = PropertyBs.getInstance("read.properties")
.getOrDefault("hello2", "default");
read.properties 为文件路径,hello2 为不存在的属性值名称,default 为属性不存在时返回的默认值。
设置属性
PropertyBs.getInstance("writeAndFlush.properties").setAndFlush("hello", "world-set");
writeAndFlush.properties 为文件路径,hello 为需要设置的属性信息。
引导类方法概览
序号 | 方法 | 说明 |
---|---|---|
1 | getInstance(propertyPath) | 获取指定属性文件路径的引导类实例 |
2 | charset(charset) | 指定文件编码,默认为 UTF-8 |
3 | get(key) | 获取 key 对应的属性值 |
4 | getOrDefault(key, defaultValue) | 获取 key 对应的属性值,不存在则返回 defaultValue |
5 | set(key, value) | 设置值(内存) |
6 | remove(key) | 移除值(内存) |
7 | flush() | 刷新内存变更到当前文件磁盘 |
9 | flush(path) | 刷新内存变更到指定文件磁盘 |
10 | set(map) | 设置 map 信息到内存 |
11 | set(bean) | 设置 bean 对象信息到内存 |
12 | asMap() | 返回内存中属性信息,作为 Map 返回 |
13 | asBean(bean) | 返回内存中属性信息到 bean 对象中 |
对象
简介
我们希望操作 property 可以想操作对象一样符合 OO 的思想。
设置值
User user = new User();
user.setName("hello");
user.setHobby("hobby");
final long time = 1574147668411L;
user.setBirthday(new Date(time));
PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties")
.set(user);
Assert.assertEquals("hobby", propertyBs.get("myHobby"));
Assert.assertEquals("1574147668411", propertyBs.get("birthday"));
读取值
PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties"
.set("myHobby", "play")
.set("birthday", "1574147668411");
User user = new User();
propertyBs.asBean(user);
Assert.assertEquals("play", user.getHobby());
Assert.assertEquals(1574147668411L, user.getBirthday().getTime());
对象定义
User.java
public class User {
private String name;
@PropertyField("myHobby")
private String hobby;
@PropertyField(converter = DateValueConverter.class)
private Date birthday;
}
@PropertyField 注解
序号 | 属性 | 默认值 | 说明 |
---|---|---|---|
1 | value | 当前字段名称 | 对应的 property 属性名称 |
2 | converter | 默认转换实现 DefaultValueConverter | 对当前字段进行属性的转换处理 |
自定义转换类
DateValueConverter.java
这个就是我们针对 Date 类型,自己实现的处理类型。
实现如下:
public class DateValueConverter implements IValueConverter {
@Override
public Object fieldValue(String value, IFieldValueContext context) {
return new Date(Long.parseLong(value));
}
@Override
public String propertyValue(Object value, IPropertyValueContext context) {
Date date = (Date)value;
return date.getTime()+"";
}
}
集合
说明
有时候一个属性可能是集合或者数组,这里暂时给出比较简单的实现。
将字段值直接根据逗号分隔,作为属性值。
测试案例
UserArrayCollection userArrayCollection = buildUser();
PropertyBs propertyBs = PropertyBs.getInstance("setBeanArrayCollection.properties")
.set(userArrayCollection);
Assert.assertEquals("array,collection", propertyBs.get("alias"));
Assert.assertEquals("array,collection", propertyBs.get("hobbies"));
对象定义
UserArrayCollection.java
public class UserArrayCollection {
private List<String> alias;
private String[] hobbies;
}
暂时只支持 String 类型,不想做的过于复杂。
后期将考虑添加各种类型的支持。
多级对象
说明
有时候我们在一个对象中会引用其他对象,比如 对象 a 中包含对象 b。
这里采用 a.b.c 这种方式作为属性的 key, 更加符合使用的习惯。
测试案例
设置
Book book = new Book();
book.name("《海底两万里》").price("12.34");
UserEntry user = new UserEntry();
user.name("海伦").book(book).age("10");
PropertyBs propertyBs = PropertyBs.getInstance("setBeanEntry.properties")
.set(user);
Assert.assertEquals("海伦", propertyBs.get("name"));
Assert.assertEquals("10", propertyBs.get("age"));
Assert.assertEquals("《海底两万里》", propertyBs.get("book.name"));
Assert.assertEquals("12.34", propertyBs.get("book.price"));
读取
Map<String, String> map = new HashMap<>();
map.put("name", "海伦");
map.put("age", "10");
map.put("book.name", "《海底两万里》");
map.put("book.price", "12.34");
UserEntry userEntry = new UserEntry();
PropertyBs.getInstance("setBeanEntry.properties")
.set(map)
.asBean(userEntry);
Assert.assertEquals("UserEntry{name='海伦', age=10, book=Book{name='《海底两万里》', price=12.34}}",
userEntry.toString());
对象定义
UserEntry.java
public class UserEntry {
private String name;
private String age;
@PropertyEntry
private Book book;
}
Book.java
public class Book {
private String name;
private String price;
}
@PropertyEntry 说明
@PropertyEntry 注解用来标识一个字段是否采用多级对象的方式表示。
这个注解只有一个属性,就是 value(),可以用来给当前字段指定一个别称,和 @PropertyField 别称类似。
后续特性
提供更多内置的类型转换实现
来源:https://www.cnblogs.com/houbbBlogs/p/11901764.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 前言本文主要介绍JWT的实战运用。准备工作首先我们创建一个Asp.Net的,包含MVC和WebApi的Web项目。然后使用Nuget搜索JW
- ByteArrayInputStream介绍ByteArrayInputStream 是字节数组输入流。它继承于 InputStream。I
- 本人是用易语言起步的,起初是为了兴趣,后来由于易语言被杀软误杀严重,连空白程序都杀,后来转到了学C#,随着学习的深入,接触越来越复杂的东西之
- 现在的项目越来越多的都是打包成jar运行尤其是springboot项目,这时候配置文件如果一直放在项目中,每次进行简单的修改时总会有些不方便
- step1:先移除centos自带的jdkrpm -qa|grep javarpm -e --nodeps xxstep2:安装jdk (所
- Flutter中的生命周期类似于Vue、React中的生命周期一样,有初始化、状态更新、停用、销毁等。在React中,组件分为函数式组件和类
- 删除以逗号隔开的字符串中某一个值例如要删除 “1,2,3,4” 中的 2,返回 &ldquo
- 前言日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但
- 前言在上一篇文章中《Notification自定义界面》中我们实现了自定义的界面,那么我们该怎么为自定义的界面添加点击事件呢?像酷狗在通知栏
- 在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称
- 本文实例为大家分享了android实现密码框右侧显示小眼睛的具体代码,供大家参考,具体内容如下实现效果<?xml version=&q
- 引言 基于生成图片实现了一个手机号转图片的需求。 内容也很简单,直接
- Java序列化是什么?Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程。反序列化
- 一、静态代理模式1.1、 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标
- Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,
- 1.这是一个通过Java反射机制解析的工具类2.使用时只需创建对应的对象,并在Excel的第一行填上对应的属性名3.首先要添加相关的jar包
- 流是字节序列的抽象概念。文件是数据的静态存储形式,而流是指数据传输时的形态。流类分为两个大类:节点流类和过滤流类(也叫处理流类)。程序用于直
- 在使用feign调用其它服务时,发现获取的参数是null,当参数是对象是,是执行的Post请求,所以要在方法参数前加@RequestBody
- 我们通过项目的reimport等众多办法无法解决之后:假设这个是爆红的,因为被我已经解决了。我们进入到我们的本地仓库, 新建包。在repos
- 本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下:简单描述最高位是符号位,始终为0,不可用。41位的时间序列,