Как Guice внедряет типизированный конфиг? - PullRequest
1 голос
/ 16 января 2020

Недавно я читаю какой-то код scala, который использует Guice для внедрения конфигурации Typesafe. Мне кажется, что это просто волшебство c, как это работает. Мой вопрос: как интерпретировать этот код? Вводит ли Guice все эти значения конфигурации, считанные из sbt-assembly, в типизированный config автоматически?

Scala код:

class FooImpl @Inject() (
  config: Config
) extends Foo {

  private val myConfig = "section.foo"

  override val batchSize = config.getInt(s"$myConfig.batchSize")

  .....
}

In Setting. scala

object Settings {
    ...
    assemblyMergeStrategy in assembly := {
      case "prod.conf" => MergeStrategy.concat
      case x =>
        val oldStrategy = (assemblyMergeStrategy in assembly).value
        oldStrategy(x)
    }
  ...

In prod.conf

section {

  foo {
    batchSize = 10000
...

1 Ответ

3 голосов
/ 17 января 2020

Я думаю, что вы смешиваете три разных механизма здесь :)

  1. @ Inject - это действительно Guice, и это последний шаг в процессе. Проще говоря, у Guice есть «контейнер внедрения зависимости», который знает, где искать экземпляры определенных типов. Один из известных ему типов - Config. Как узнает, что это зависит от используемой вами среды (или от того, как вы создаете экземпляр своего контейнера Guice, если вы его не используете);

  2. В Typesafe config есть правила поиска конфигурации. Readme суммирует это довольно хорошо, но вкратце - он находит application.conf в папке ресурсов (или, фактически, в любом месте пути к классам), а затем импортирует все другие файлы, которые application.conf явно импортирует (используя import other_conf.conf). Я предполагаю, что в вашем случае import prod.conf где-то в сборке application.conf

  3. - просто помещает все ресурсы из всех зависимостей в одну гигантскую папку ресурсов - определяя правила того, что делать, если есть несколько файлов с одним и тем же именем. В вашем случае он говорит просто объединить их.

...