我有以下代码:
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
类绑定到我创建的实例,我真的不明白为什么Guice正在查看Context
的注释。谁能告诉我这里发生了什么?
答案 0 :(得分:2)
Guice会自动在绑定语句中注入传递给toInstance()
的实例,因此@Inject
上的Context
注释是相关的。
在您的示例中,Guice不是创建Context
的新实例,而是使用空字符串注入实例的字段。
当您为该属性添加注释时,Kotlin会在该字段上添加注释。当你注释吸气剂时,Guice会忽略它。