SimpleConfig

[TOC]

SimpleConfig 是一个轻量级的配置加载器,适用于简单的配置场景。

System Requirements

  • JDK 1.6+

Features

  • 轻量级 - 整体代码结构简单,不同于功能强大的分布式配置中心,SimpleConfig支持最常用的数据库和配置文件,无需额外依赖
  • 配置类 - 可以快速将数据库和配置文件内的属性映射为Java对象,并自动转换为类内字段类型
  • 热更新 - 配置内容改变时,可自动更新Java对象,并支持内容监听

Maven

<dependency>
    <groupId>org.team4u.config</groupId>
    <artifactId>simple-config</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>org.team4u.dao</groupId>
    <artifactId>simple-dao</artifactId>
    <version>1.0.4</version>
</dependency>
<dependency>
    <groupId>org.team4u</groupId>
    <artifactId>team-kit-core</artifactId>
    <version>1.0.5</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>4.0.9</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-log</artifactId>
    <version>4.0.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.45</version>
</dependency>

添加仓库:

<repositories>
    <repository>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>bintray-team4u</id>
        <name>bintray</name>
        <url>https://dl.bintray.com/team4u/team4u</url>
    </repository>
</repositories>

How To Use

数据库配置加载器

创建配置表

CREATE TABLE system_config
(
  id          BIGINT UNSIGNED AUTO_INCREMENT
  COMMENT '自增长标识',
  is_enabled  TINYINT DEFAULT 1                                                   NOT NULL
  COMMENT '是否开启',
  type        VARCHAR(32) DEFAULT ''                                              NOT NULL
  COMMENT '类型',
  name        VARCHAR(255) DEFAULT ''                                             NOT NULL
  COMMENT '名称',
  value       VARCHAR(4000) DEFAULT ''                                            NOT NULL
  COMMENT '',
  sequence_no BIGINT DEFAULT 0                                                    NOT NULL
  COMMENT '顺序号',
  description VARCHAR(255) DEFAULT ''                                             NOT NULL
  COMMENT '描述',
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP                                 NOT NULL
  COMMENT '创建时间',
  update_time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP     NOT NULL
  COMMENT '更新时间',
  PRIMARY KEY (id)
)
  COMMENT '系统配置';

CREATE INDEX idx_type_name
  ON system_config (type, name);

插入数据

类型 名称 是否开启 序号 描述
app a 1 1 0
app b 1 1 0
app d 1,2,3 1 0
app e {'name':'fjay','age':1} 1 0
app h 1,2,3 1 0

定义配置类

@ConfigurationProperties("app")
public class Config {

    private Integer a;

    private Boolean b;

    private Integer[] d;

    private E e;
  
    private List<Integer> h;
    
    // 省略get/set方法
}

public class E {
  String name;
  Integer age;

  // 省略get/set方法
}

使用加载器

DbConfigLoader<DefaultSystemConfig> dbConfigLoader = new DbConfigLoader<DefaultSystemConfig>(DefaultSystemConfig.class, dataSource);

Config config = dbConfigLoader.to(Config.class);

配置文件加载器

定义配置

app.a=1
app.b=1
app.d=2,1
app.e={'name':'fjay','age':1}
app.h=2, 1

使用加载器

PropsConfigLoader propsConfigLoader = new PropsConfigLoader("config.properties")

Config config = propsConfigLoader.to(Config.class);

缓存配置加载器

使用PullCacheConfigLoader可以将PropsConfigLoader或者DbConfigLoader生成的配置对象进行缓存,多次调用仅初始化一次配置类。

PullCacheConfigLoader<DefaultSystemConfig> loader = new PullCacheConfigLoader<DefaultSystemConfig>(dbConfigLoader, 0);
Config config1 = loader.to(Config.class);
Config config2 = loader.to(Config.class);
// config1 == config2

PullCacheConfigLoader同时支持热更新,配置同步间隔时间即可。

// 10s拉取一次数据库配置
PullCacheConfigLoader<DefaultSystemConfig> loader = new PullCacheConfigLoader<DefaultSystemConfig>(dbConfigLoader, 10000);
Config config = loader.to(Config.class);

// a的值为1
config.getA()
  
// 手工更改数据库a配置值为2
  
// 10s后a的值变为2
config.getA()

Watcher可以监听配置变化

PullCacheConfigLoader<DefaultSystemConfig> loader = new PullCacheConfigLoader<DefaultSystemConfig>(
        dbConfigLoader, 60000, new Watcher<DefaultSystemConfig>() {

    @Override
    public void onCreate(DefaultSystemConfig newConfig) {
        System.out.println("onCreate");
    }

    @Override
    public void onModify(DefaultSystemConfig newConfig) {
        System.out.println("onModify");
    }

    @Override
    public void onDelete(DefaultSystemConfig oldConfig) {
        System.out.println("onDelete");
    }

    @Override
    public void onError(Throwable e) {
	   System.out.println("onError");
    }
});

END