# bean-ini-store **Repository Path**: mathcoder23/bean-ini-store ## Basic Information - **Project Name**: bean-ini-store - **Description**: 在Java项目开发中,经常遇到将项目配置文件对外提供给运维人员配置使用。在Spring中已经很友好的提供了yml、properties的方式读取配置。 但是我们有这种场景,为了降低配置文件的运维难度,一份有详细注释的的配置文件是我们需要。当然我们期望的不仅仅是降低运维难度,我们还期望降低开发的开发难度。因此有了这个开源项目。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 背景 在Java项目开发中,经常遇到将项目配置文件对外提供给运维人员配置使用。在Spring中已经很友好的提供了yml、properties的方式读取配置。 但是我们有这种场景,为了降低配置文件的运维难度,一份有详细注释的的配置文件是我们需要。当然我们期望的不仅仅是降低运维难度,我们还期望降低开发的开发难度。因此有了这个开源项目。 # 项目地址 [https://gitee.com/mathcoder23/bean-ini-store](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注解说明 ```java /** * 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注解 ```java /** * 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案例 ```java 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; } } ``` ## 测试代码 ```java 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) } } ```