java property配置文件管理工具框架过程详解

 更新时间:2019年11月21日 09:46:24   作者:叶止水  
这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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 别称类似。

后续特性

提供更多内置的类型转换实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍

    Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍

    这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下
    2015-03-03
  • SpringBoot整合Web开发之文件上传与@ControllerAdvice

    SpringBoot整合Web开发之文件上传与@ControllerAdvice

    @ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此
    2022-08-08
  • 一篇文章让你三分钟学会Java枚举

    一篇文章让你三分钟学会Java枚举

    这篇文章主要给大家介绍了如何通过三分钟学会Java枚举的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用Java 8中的Lambda表达式实现工厂模式

    使用Java 8中的Lambda表达式实现工厂模式

    这篇文章主要给大家介绍了使用Java 8中的Lambda表达式实现工厂模式的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • 一文带你搞懂Java单例模式

    一文带你搞懂Java单例模式

    单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并且在系统全局都可以访问这个对象而不用重新创建。本文将通过示例为大家详细讲解Java单例模式的使用,需要的可以参考一下
    2022-11-11
  • Java中的阻塞队列详细介绍

    Java中的阻塞队列详细介绍

    这篇文章主要介绍了Java中的阻塞队列详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • Java避免死锁_动力节点Java学院整理

    Java避免死锁_动力节点Java学院整理

    在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术。对java避免死锁的相关知识感兴趣的朋友一起通过本文学习吧
    2017-06-06
  • SpringCloud Zuul网关功能实现解析

    SpringCloud Zuul网关功能实现解析

    这篇文章主要介绍了SpringCloud Zuul网关功能实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Springboot使用SPI注册bean到spring容器的示例代码

    Springboot使用SPI注册bean到spring容器的示例代码

    这篇文章主要介绍了Springboot使用SPI注册bean到spring容器,主要包括mydriver接口,mysqldriver实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java中List的使用方法简单介绍

    Java中List的使用方法简单介绍

    这篇文章主要针对Java中List的使用方法为大家介绍了进行简单介绍,List是个集合接口,只要是集合类接口都会有个“迭代子”( Iterator ),利用这个迭代子,就可以对list内存的一组对象进行操作,感兴趣的小伙伴们可以参考一下
    2016-07-07

最新评论