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