OWNER支持配置文件目录的继承

什么是OWNER

OWNER 是一个开源项目,旨在解决Java配置文件的解析问题。mysql

例如配置文件 /data/config.properties 包含下列内容:sql

server.port=80
server.hostname=foobar.com
server.max.threads=100

为了解析这个配置文件,咱们首先定义一个Java接口:spa

import org.aeonbits.owner.Config;

@Sources({ //定义配置文件的路径
     "file:/data/config.properties",
     "classpath: config.properties" 
})    
public interface ServerConfig extends Config {
    @Key("server.port")
    int port();

    @Key("server.hostname")
    String hostname();

    @Key("server.max.threads");
    @DefaultValue("42")
    int maxThreads();
}

加载配置文件:code

ServerConfig cfg = ConfigFactory.create(ServerConfig.class);
System.out.println("Server " + cfg.hostname() + ":" + cfg.port() +
                   " will run " + cfg.maxThreads());

配置文件路径的继承

在实际应用中,配置文件内容上通常会包括多个分组,每个分组定义成一个接口会更加清晰,同时全部的接口须要从相同的配置文件列表中加载。例如除了上面例子中展现的server配置之外,还要定义mysql的信息,就须要添加一个接口并从新定义Sources :server

import org.aeonbits.owner.Config;

@Sources({ //定义配置文件的路径
     "file:/data/config.properties",
     "classpath: config.properties" 
})    
public interface MysqlConfig extends Config {
    @Key("mysql.port")
    int port();

    @Key("mysql.hostname")
    String hostname();
}

因为Sources这个annonation不支持继承,因此每次新添加一组配置项的时候就须要重写一遍Sources,这样一来容易出错而且之后修改配置文件路径的时候多有不便。我提交了一个patch解决了这个问题,已经merge到master,针对这种状况就能够这样写了:继承

import org.aeonbits.owner.Config;

@Sources({ //定义配置文件的路径
     "file:/data/config.properties",
     "classpath: config.properties" 
})    
public interface BaseConfig extends Config {
    
}
import org.aeonbits.owner.Config;

public interface ServerConfig extends BaseConfig {
    @Key("server.port")
    int port();

    @Key("server.hostname")
    String hostname();

    @Key("server.max.threads");
    @DefaultValue("42")
    int maxThreads();
}
import org.aeonbits.owner.Config;

public interface MysqlConfig extends BaseConfig {
    @Key("mysql.port")
    int port();

    @Key("mysql.hostname")
    String hostname();
}
相关文章
相关标签/搜索