注入一个实例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不使用我精心创建的实例,并以Moduleforms提供给注入器? (这是第一个问题。)

但是,如果我更改Context看起来像这样:

 class Context { @get:Inject lateinit var property: String } 

测试突然成功了。 如果我已经将Context类绑定到我创建的实例上,我不明白为什么Guice正在查看Context的注释。 有谁能告诉我这里发生了什么?

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

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

当你注解这个属性时,Kotlin把注释放在这个字段上。 当你注释吸气剂时,Guice忽略它。