Вы можете попробовать OWNER API : он поддерживает 3 уровня переопределения свойств, а также обеспечивает сопоставление между объектом Java и файлами свойств и другими полезными функциями.
Первая возможность переопределенияявляется спецификацией значения по умолчанию для интерфейса отображения:
public interface ServerConfig extends Config {
@DefaultValue("42")
int maxThreads();
}
ServerConfig по умолчанию сопоставляется с ServerConfig.properties в том же пакете.Если свойство «maxThreads» не указано, то по умолчанию используется значение 42 (файлы свойств переопределяют DefaultValue).
Вторая возможность переопределения - это возможность указать несколько местоположений файлов свойств для класса, поэтомупервый найденный ресурс используется.Таким образом, вы определяете внутренние свойства в вашем jar-файле и позволяете пользователю указать файл переопределяющих свойств в его домашнем каталоге или в / etc / myapp, или везде, где вы предпочитаете:
@Sources({ "file:~/.myapp.config",
"file:/etc/myapp.config",
"classpath:foo/bar/baz.properties" })
public interface ServerConfig extends Config {
@Key("server.http.port")
int port();
@Key("server.host.name")
String hostname();
@Key("server.max.threads");
@DefaultValue("42")
int maxThreads();
}
Третье переопределениеМожно указать, что вы хотите, чтобы все вышеперечисленные файлы были рассмотрены, но вы хотите, чтобы переопределение происходило на уровне свойств, поэтому, если все вышеуказанные файлы свойств доступны, при запросе свойства maxThreads()
это будетсначала выполняется поиск в file:~/.myapp.config
- если не найден - затем в file:/etc/myapp.config
, а затем в classpath:foo/bar/baz.properties
, и, в крайнем случае, применяется @DefaultValue("42")
, затем вы указываете библиотеке, что она должна произвести слияние из всех ресурсов свойств (и рассмотрим их все)
@LoadPolicy(LoadType.MERGE)
@Sources({ "file:~/.myapp.config",
"file:/etc/myapp.config",
"classpath:foo/bar/baz.properties" })
public interface ServerConfig extends Config {
// same content as above.
}