Guice 如何注入类型安全配置?
How does Guice inject typesafe config?
最近我正在阅读一些使用 Guice 注入 Typesafe Config 的 scala 代码。我觉得它的工作原理有点神奇。我的问题是,如何解释这段代码? Guice 是否自动将所有在 sbt-assembly 中读取的配置值注入到类型安全配置中?
Scala 代码:
class FooImpl @Inject() (
config: Config
) extends Foo {
private val myConfig = "section.foo"
override val batchSize = config.getInt(s"$myConfig.batchSize")
.....
}
在Setting.scala
object Settings {
...
assemblyMergeStrategy in assembly := {
case "prod.conf" => MergeStrategy.concat
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
...
在prod.conf
section {
foo {
batchSize = 10000
...
我认为您在这里混合了三种不同的机制:)
@Inject 确实是 Guice,它是这个过程的最后一步。简而言之,Guice 有一个 "dependency injection container" 知道在哪里寻找特定类型的实例。它知道的一种类型是 Config
。 它如何知道这取决于您使用的框架(或者如果您不使用它,您如何实例化您的 Guice 容器);
类型安全配置有关于在哪里查找配置的规则。 Readme 总结得很好,但简而言之 - 它在资源文件夹中找到 application.conf(或者,实际上,在类路径上的任何位置),然后导入 application.conf
显式导入的所有其他文件(使用 import other_conf.conf
)。我假设在你的情况下 import prod.conf
在 application.conf
的某处
Assembly - 只是将所有依赖项中的所有资源放入一个巨大的资源文件夹中 - 指定如果有多个同名文件时该怎么做的规则。在你的情况下,它告诉它只是连接它们。
最近我正在阅读一些使用 Guice 注入 Typesafe Config 的 scala 代码。我觉得它的工作原理有点神奇。我的问题是,如何解释这段代码? Guice 是否自动将所有在 sbt-assembly 中读取的配置值注入到类型安全配置中?
Scala 代码:
class FooImpl @Inject() (
config: Config
) extends Foo {
private val myConfig = "section.foo"
override val batchSize = config.getInt(s"$myConfig.batchSize")
.....
}
在Setting.scala
object Settings {
...
assemblyMergeStrategy in assembly := {
case "prod.conf" => MergeStrategy.concat
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
...
在prod.conf
section {
foo {
batchSize = 10000
...
我认为您在这里混合了三种不同的机制:)
@Inject 确实是 Guice,它是这个过程的最后一步。简而言之,Guice 有一个 "dependency injection container" 知道在哪里寻找特定类型的实例。它知道的一种类型是
Config
。 它如何知道这取决于您使用的框架(或者如果您不使用它,您如何实例化您的 Guice 容器);类型安全配置有关于在哪里查找配置的规则。 Readme 总结得很好,但简而言之 - 它在资源文件夹中找到 application.conf(或者,实际上,在类路径上的任何位置),然后导入
application.conf
显式导入的所有其他文件(使用import other_conf.conf
)。我假设在你的情况下import prod.conf
在application.conf
的某处
Assembly - 只是将所有依赖项中的所有资源放入一个巨大的资源文件夹中 - 指定如果有多个同名文件时该怎么做的规则。在你的情况下,它告诉它只是连接它们。