什么是OWNER
是一个开源项目,旨在解决Java配置文件的解析问题。
例如配置文件 /data/config.properties 包含下列内容:
server.port=80server.hostname=foobar.comserver.max.threads=100
为了解析这个配置文件,我们首先定义一个Java接口:
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();}
加载配置文件:
ServerConfig cfg = ConfigFactory.create(ServerConfig.class);System.out.println("Server " + cfg.hostname() + ":" + cfg.port() + " will run " + cfg.maxThreads());
配置文件路径的继承
在实际应用中,配置文件内容上一般会包括多个分组,每一个分组定义成一个接口会更加清晰,同时所有的接口需要从相同的配置文件列表中加载。例如除了上面例子中展示的server配置以外,还要定义mysql的信息,就需要添加一个接口并重新定义Sources :
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();}