使用 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 会忽略它。