3

我没有在 Kotlin 中获得基于 Spring 的 setter 依赖注入工作,因为它总是以错误消息“lateinit property api has not been initialized”终止。我可以将问题简化为以下场景:有一个接口

interface IApi {
  fun retrieveContent(): String
}

这是由

class Api : IApi {
    override fun retrieveContent() = "Some Content"
}

我想在另一个应该发生依赖注入的类中使用实现:

@Component
class SomeController {
    @Autowired lateinit var api: IApi
    fun printReceivedContent() {
        print(api.retrieveContent())
    }
}

但是,应用程序终止并显示上述错误消息。我的 Spring 配置如下所示:

@Configuration
open class DIConfig {
    @Bean
    open fun getApiInstance(): IApi = Api()
}

在主函数中,我加载应用程序上下文并调用方法:

fun main(args: Array<String>) {
    val context = AnnotationConfigApplicationContext()
    context.register(DIConfig::class.java)
    context.refresh()

    val controller = SomeController()
    controller.printReceivedContent()
}

这里有什么问题?

4

3 回答 3

3

如果您像这样自己调用构造函数,则不涉及 Spring。和Java一样,

val controller = context.getBean(SomeController::class.java)

Spring Framework 5.0 添加了Kotlin 扩展,因此您也可以编写其中之一

val controller = context.getBean<SomeController>()
val controller: SomeController = context.getBean()
于 2017-11-09T19:08:52.500 回答
0

您的 api 目前不是 spring 管理的 bean,请尝试使用 @Service 或 @Component 对其进行注释

于 2021-03-12T14:05:41.047 回答
-1

@Autowired通常将其添加到属性的设置器中。因此,您应该显式注释设置器,而不是将其用于属性:

@set:Autowired lateinit var api: IApi
于 2017-11-09T15:31:03.917 回答