【问题标题】:Injecting an Instance Fails with Kotlin & Guice使用 Kotlin 和 Guice 注入实例失败
【发布时间】:2017-01-25 06:44:20
【问题描述】:

我有以下代码:

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 的注释。谁能告诉我这是怎么回事?

【问题讨论】:

    标签: guice kotlin


    【解决方案1】:

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

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

    当你注释属性时,Kotlin 将注释放在字段上。当您注释 getter 时,Guice 会忽略它。

    【讨论】:

    • 当使用private val injector = Guice.createInjector(Module { it.bind(Context::class.java).toProvider { context } }) 时,它的行为最终符合我的预期。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多