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(); }