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 别称类似。

后续特性

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

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

时间: 2019-11-21

Java使用application.property读取文件里面的值

自定义工具类PropertyUtil,并在该类的static静态代码块中读取properties文件内容保存在static属性中以供别的程序使用 package com.hafiz.www.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.Properties; /** * Desc:properties文件获取工具类 * Created by haf

Java Property类使用详解

概念理解 Properties 继承于 Hashtable.表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串.Properties类被许多Java类使用.例如,在获取环境遍历时它就作为System.getProperties()方法的返回值.我们在很多需要避免硬编码的应用场景下需要使用Properties文件来加载程序需要配置的信息,比如JDBC.MyBatis框架等.Properties类则是Properties文件和程序的中间桥梁,不论是从prope

JSP JavaBean的setProperty属性

1.包: 复制代码 代码如下: package PaintBrush; /** * * @author lucifer */ public class PaintBrush { private String curcolor = "red"; public String getColor(){ return curcolor; } public void setColor(String color){ curcolor = color; } } 2.JSP代码: 复制代码 代码如下:

Java通过PropertyDescriptor反射调用set和get方法

本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class PropertyUtil { @SuppressWarnings("unchecked") p

详解java中的PropertyChangeSupport与PropertyChangeListener

详解java中的PropertyChangeSupport与PropertyChangeListener java中的PropertyChangeSupport与PropertyChangeListener配合使用能够实现,绑定属性会在属性值发生变化时,通知所有相关的监听器. javaBean: package com.wang.test.property; import java.beans.PropertyChangeListener; import java.beans.PropertyC

Mybatis单个参数的if判断报异常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解决方案

我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可以了,如下: 1.常规代码 <update id="update" parameterType="com.cq2022.zago.order.entity.Test" > update t_test_l <set > <if test="trnsctWayId != null"

Java的System.getProperty()方法获取大全

本文实例汇总了Java的System.getProperty()方法获取信息的用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 System.out.println("Java提供商名称:" + System.getProperty("java.vendor"

Java反射通过Getter方法获取对象VO的属性值过程解析

这篇文章主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息.

Java 使用getClass().getResourceAsStream()方法获取资源

Java 使用getClass().getResourceAsStream()方法获取资源 之前想获取一个资源文件做一些处理,使用getClass().getResourceAsStream()一直拿不到文件. 具体的用法. 1 InputStream is = this.getClass().getResourceAsStream(fileName); //拿不到资源 2 InputStream is = this.getClass().getResourceAsStream("/"

通过System.getProperty配置JVM系统属性

很多时候我们需要在项目中读取外部属性文件,用到了System.getProperty("")方法.这个方法需要配置JVM系统属性,那么如何配置呢? 那就是使用java -D 配置系统属性. 使用格式是:java -Dkey=value 比如新建一个测试类,如下: public class Test { public static void main(String[] args){ System.out.println(System.getProperty("configure

Java获取当前系统事件System.currentTimeMillis()方法

System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,Date()其实就是相当于Date(System.currentTimeMillis()),因为Date类还有构造Date(longdate),用来计算long秒与1970年1月1日之间的毫秒差. 得到了这个毫秒数,我们自己也可以算起现在的年月日周时,但是这不是我们去计算的,因为有Calendar.Calendar最终结出的结果就是年月日周时时区. System.curre

Java反射之通过反射获取一个对象的方法信息(实例代码)

以下代码为一个工具类 package com.imooc.reflect; import java.lang.reflect.Method; public class ClassUtil { public static void printClassMessage(Object obj){ //要获取类的信息,首先要获取类的类类型 Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型 //获取类的名称 System.out.println("类的名称

Java String方法获取字符出现次数及字符最大相同部分示例

本文实例讲述了Java String方法获取字符出现次数及字符最大相同部分.分享给大家供大家参考,具体如下: package demo; public class Test { public static void main(String[] args) { String str = "dasdalldsdslldsdszxll"; System.out.println("count="+get(str,"ll"));//打印ll出现的次数 St

java 从int数组中获取最大数的方法

首先要有数组的概念吧,知道什么是数组,简单讲就是存放一组数据的一个组合,就是一个数组....哈哈 已知一个int数组, 编程从数组中获取最大数. 思路分析: 1.一个数组可能有很多个数字,要取最大数,那就是一个数一个数的进行比较可以可以选出来了是吧 那么就是:先定义一个变量赋值为数组的第一个数,然后在和数组的第二.第三个数相比较,遇到比自己大的就将打的数值赋给这个变量,遍历到最后就可以了. 代码: package com.itheima; /** * 2. 已知一个int数组, 编程从数组中获取

Java使用entrySet方法获取Map集合中的元素

本文为大家分享了使用entrySet方法获取Map集合中元素的具体代码,供大家参考,具体内容如下 /*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这个关系的数据类型是Map.Entry ....entrySet方法返回值类型的具体写法为:Set< Map.Entry<KeyType , ValueType> > -----------

Java使用keySet方法获取Map集合中的元素

本文为大家分享了Map集合中利用keySet方法获取所有的元素值,供大家参考,具体内容如下 /*--------------------------- Map集合中利用keySet方法获取所有的元素值: ....keySet方法:将Map中的所有key值存入到Set集合中, ....利用Set集合提供的迭代器获取到每一个key值,再通过key值获得相应的value值 ----------------------------*/ package pack03; import java.util.*