背景
在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)
}
}

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

被折叠的 条评论
为什么被折叠?



