用Kotlin&注册实例失败吉斯

时间:2017-01-25 06:44:21

标签: guice kotlin

我有以下代码:

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的注释。谁能告诉我这里发生了什么?

1 个答案:

答案 0 :(得分:2)

Guice会自动在绑定语句中注入传递给toInstance()的实例,因此@Inject上的Context注释是相关的。

在您的示例中,Guice不是创建Context的新实例,而是使用空字符串注入实例的字段。

当您为该属性添加注释时,Kotlin会在该字段上添加注释。当你注释吸气剂时,Guice会忽略它。