Java开源自动刷新读写配置文件以及注释的工具类

本文介绍了一个Java开源项目,它实现了Java Bean与 Ini 文件的双向绑定,使得配置文件的修改能自动刷新到Bean,并且支持从Bean的注释映射到Ini文件,降低了运维和开发的复杂性。项目地址:https://gitee.com/mathcoder23/bean-ini-store,包括@IniFile和@IniField注解的使用说明,以及示例代码。

背景

在Java项目开发中,经常遇到将项目配置文件对外提供给运维人员配置使用。在Spring中已经很友好的提供了yml、properties的方式读取配置。
但是我们有这种场景,为了降低配置文件的运维难度,一份有详细注释的的配置文件是我们需要。当然我们期望的不仅仅是降低运维难度,我们还期望降低开发的开发难度。因此有了这个开源项目。

项目地址

https://gitee.com/mathcoder23/bean-ini-store

项目功能(bean-ini-store)

  • 基于Java Bean。开发人员面向Bean对象开发。
  • 基于Ini文件。运维人员面向Ini文件配置参数。
  • Bean与Ini文件双向绑定。
  • Ini文件修改,自动刷新到Bean
  • 支持将Bean的备注信息,映射到Ini文件

使用说明

  • 1.需要进行映射的Bean对象需要继承抽象类BaseBeanIni
  • 2.Bean对象的类声明处使用@IniFile注解
  • 3.Bean对象的属性使用@IniField注解
  • 4.Bean对象使用线程安全的单例模式,然后调用BaseBeanIni中的init()方法

@IniFile注解说明


/**
 * ini配置文件注解
 * @author pettyfox.top  
 * @version V1.0   
 * @date 2020-05-09
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IniFile {
    /**
     * 配置文件路径,支持正反斜杆,会根据系统类型处理分隔符
     * 配置文件会自动生成,将bean的默认值写到文件中
     * @return 配置文件路径
     */
    String storePath() default "config/config.ini";
    String charset() default "UTF-8";

    /**
     * @return 多行配置文件注释
     */
    String[] fileComments() default {};

    /**
     * @return 是否开启配置文件修改实时生效
     */
    boolean autoRefreshFile() default true;
}

@IniField注解


/**
 * ini配置文件字段注解
 * @author pettyfox.top  
 * @version V1.0   
 * @date 2020-05-09
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
public @interface IniField {
    /**
     * @return 分组名称
     */
    String group() default "";

    /**
     * @return 配置文件中注解
     */
    String[] comments() default {};

    /**
     * @return 组字段注解,仅在最后一个@IniFiled中生效
     */
    String[] groupComments() default {};
}

demo案例

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.pettyfox.utils.io.bis.annotation.IniField;
import org.pettyfox.utils.io.bis.annotation.IniFile;
import org.pettyfox.utils.io.bis.bean.BaseBeanIni;

/**
 *     
 *
 * @author pettyfox.top  
 * @version V1.0   
 * @date 2020-05-10
 */

@EqualsAndHashCode(callSuper = true)
@IniFile(fileComments = {
         "--- 项目配置文件 ---"
        ,"--- 配置实时生效,请运维人员了解每个字段含义后配置 ---"
})
@Data
public class DemoBeanIni extends BaseBeanIni {
    private static final String GROUP_BOOT = "boot";
    private static final String GROUP_LOG = "log";
    private DemoBeanIni(){
        init();
    }
    public static final DemoBeanIni INSTANCE = new DemoBeanIni();
    @IniField
    private String backupDir = "/backups";

    @IniField(comments = {"认证id"})
    private String appId;

    @IniField(comments = {"认证key"})
    private String appKey;

    @IniField
    private int backupDays = 180;

    @IniField(comments = {"web端口号"},group = GROUP_BOOT,groupComments={"此组配置,修改后重启生效"})
    private int webPort = 8080;

    @IniField(comments = {"webIP,不填自动获取"},group = GROUP_BOOT)
    private String webIp = "127.0.0.1";

    @IniField(group = GROUP_BOOT)
    private Boolean https = true;

    @IniField(comments = {"是否显示日志"},group = GROUP_LOG,groupComments={"此组配置,修改实时生效"})
    private boolean show = false;

    @IniField(comments = {"日志等级","ERROR、WARN、INFO、DEBUG"},group = GROUP_LOG)
    private String level = "INFO";

    @IniField(comments = {"日志保留天数"},group = GROUP_LOG)
    private int expireDay = 20;

    @Override
    public int getVersion() {
        return 1;
    }
}

测试代码

package org.pettyfox.utils.io.bis

import spock.lang.Specification

import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

class IniFileWriteReadTest extends Specification {
    def "init test"() {
        given:
        def bean = DemoBeanIni.INSTANCE
        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
            -> println(bean.toString())
        }, 2, 2, TimeUnit.SECONDS)
        sleep(1000000)
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值