Chciałbym poznać oficjalną odpowiedź, ale nikt nie odpowiedział, więc postanowiłem zaglądać. Przepraszam, jeśli ta odpowiedź nie jest wyczerpująca.
Najlepszy przykład, jaki znalazłem, to com.twitter.ostrich.admin.RuntimeEnvironment
, zwłaszcza jeśli patrzysz głównie na loadConfig
.
Załóżmy, że chcesz skonfigurować instancję klasy T
. Podstawowa idea jest następująca:
- Get
java.io.File
który zawiera kod źródłowy Scala, którego wynikiem jest com.twitter.util.Config[T]
.
- Aby być ważnym
Config[T]
, musisz mieć metodę def apply(): T
. Aby zachować szczegóły implementacji z pliku konfiguracyjnego, należy zdefiniować klasę w projekcie, która rozszerza się o Config[T]
. Możesz także użyć tej klasy do zdefiniowania domyślnych/wymaganych pól.
- Utwórz instancję nowej instancji
com.twitter.util.Eval
i wywołaj apply(file)
, aby uzyskać instancję Config[T]
.
- Zadzwoń pod
config.validate()
, aby wyrzucić właściwe wyjątki dla zniekształconych plików konfiguracyjnych.
- Zadzwoń pod
config.apply()
, aby uzyskać w pełni skonfigurowaną instancję T
.
Oto prosty przykład, gdzie mogę skonfigurować nowy 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)
}
A oto mywidget_config.scala
:
new WidgetConfig {
port = 8000
}
Uwaga: być może trzeba będzie dokonać zmian jeśli umieścisz ten w pakiecie. Zrobiłem wszystko w domyślnym pakiecie dla zwięzłości.
Aby uzyskać zależnościami do pracy, dodałem to do mojego SBT config:
libraryDependencies += "com.twitter" % "util" % "1.10.1"
napisałem zamiennik 'Configgy'. Jest kompatybilny z większością starszych plików konfiguracyjnych, plików konfiguracyjnych akka i właściwości java. Jest dostępny na https://github.com/paradigmatic/Configrity – paradigmatic