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();
}
相關文章
相關標籤/搜索