使用 Kotlin 和 Guice 注入实例失败
Injecting an Instance Fails with Kotlin & Guice
我有以下代码:
class Test {
private val context = Context().apply {
property = "foo"
}
private val injector = Guice.createInjector(Module { it.bind(Context::class.java).toInstance(context) })
@Test
fun `service received correct context`() {
assertThat(injector.getInstance(Service::class.java).context.property, equalTo("foo"))
}
}
class Service @Inject constructor(val context: Context)
class Context {
@Inject lateinit var property: String
}
当 运行 它时,测试失败,(正确地)抱怨空字符串不是“foo”。但为什么 Guice 不使用我精心创建并以 Module
形式提供给注入器的实例? (这是第一个问题。)
但是,如果我将 Context
更改为如下所示:
class Context {
@get:Inject lateinit var property: String
}
测试突然成功了。如果我已将 Context
class 绑定到我创建的实例,我真的不明白为什么 Guice 会查看 Context
的注释。谁能告诉我这是怎么回事?
Guice 在绑定语句中自动注入传递给 toInstance()
的实例,因此 Context
上的 @Inject
注释是相关的。
在您的示例中,Guice 没有创建 Context
的新实例,而是用空字符串注入实例的字段。
当您注释 属性 时,Kotlin 会将注释放在字段上。当您注释 getter 时,Guice 会忽略它。
我有以下代码:
class Test {
private val context = Context().apply {
property = "foo"
}
private val injector = Guice.createInjector(Module { it.bind(Context::class.java).toInstance(context) })
@Test
fun `service received correct context`() {
assertThat(injector.getInstance(Service::class.java).context.property, equalTo("foo"))
}
}
class Service @Inject constructor(val context: Context)
class Context {
@Inject lateinit var property: String
}
当 运行 它时,测试失败,(正确地)抱怨空字符串不是“foo”。但为什么 Guice 不使用我精心创建并以 Module
形式提供给注入器的实例? (这是第一个问题。)
但是,如果我将 Context
更改为如下所示:
class Context {
@get:Inject lateinit var property: String
}
测试突然成功了。如果我已将 Context
class 绑定到我创建的实例,我真的不明白为什么 Guice 会查看 Context
的注释。谁能告诉我这是怎么回事?
Guice 在绑定语句中自动注入传递给 toInstance()
的实例,因此 Context
上的 @Inject
注释是相关的。
在您的示例中,Guice 没有创建 Context
的新实例,而是用空字符串注入实例的字段。
当您注释 属性 时,Kotlin 会将注释放在字段上。当您注释 getter 时,Guice 会忽略它。