Kotlin与Spring DI:lateinit属性尚未初始化

我没有在Kotlin中获得基于Spring的setter依赖注入,因为它总是以“lateinit属性API尚未初始化”的错误消息终止。 我可以将问题减少到以下情况:有一个接口

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() } 

这里有什么问题?

如果你只是像这样调用构造函数,Spring就不会涉及到。 和Java一样,

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

Spring Framework 5.0增加了Kotlin扩展 ,所以你也可以写一个

 val controller = context.getBean<SomeController>() val controller: SomeController = context.getBean() 

@Autowired通常被添加到一个属性的setter。 因此,不要将它用于属性,而应该明确注释setter:

 @set:Autowired lateinit var api: IApi