Ответ 1
Я тоже хотел бы знать официальный ответ, но никто не ответил, поэтому решил совать. Извините, если этот ответ не совсем исчерпывающий.
Лучший пример, который я нашел, был в com.twitter.ostrich.admin.RuntimeEnvironment
, особенно если вы смотрите главным образом на loadConfig
.
Предположим, вы хотите настроить экземпляр класса T
. Основная идея такова:
- Получить
java.io.File
, который содержит Scala исходный код, который оцениваетсяcom.twitter.util.Config[T]
. - Чтобы быть действительным
Config[T]
, вам нужно иметь методdef apply(): T
. Чтобы сохранить детали реализации из файла конфигурации, вам нужно определить класс в вашем проекте, который расширяетConfig[T]
. Вы также можете использовать этот класс для определения полей по умолчанию/обязательных. - Создайте новый экземпляр
com.twitter.util.Eval
и вызовитеapply(file)
, чтобы получить экземплярConfig[T]
. - Вызвать
config.validate()
, чтобы вывести правильные исключения для неверно сформированных файлов конфигурации. - Вызовите
config.apply()
, чтобы получить полностью сконфигурированный экземплярT
.
Вот простой пример, когда я настраиваю новый WidgetService
:
class WidgetService(val port: Int)
class WidgetConfig extends com.twitter.util.Config[WidgetService] {
var port = required[Int]
def apply(): WidgetService = {
new WidgetService(port)
}
}
object MyApp extends App {
val configFile = new java.io.File("mywidget_config.scala")
val eval = new com.twitter.util.Eval
val config = eval[com.twitter.util.Config[WidgetService]](configFile)
config.validate()
val widgetService = config()
println(widgetService.port)
}
И вот mywidget_config.scala
:
new WidgetConfig {
port = 8000
}
Примечание. Возможно, вам придется внести изменения, если вы поместите это в пакет. Я сделал все в пакете по умолчанию для краткости.
Чтобы заставить зависимости работать, я добавил это в мою конфигурацию SBT:
libraryDependencies += "com.twitter" % "util" % "1.10.1"