具有Spring DI:lateinit属性的Kotlin尚未初始化

具有Spring DI:lateinit属性的Kotlin尚未初始化,spring,dependency-injection,kotlin,kotlin-lateinit,Spring,Dependency Injection,Kotlin,Kotlin Lateinit,我没有让Kotlin中基于Spring的setter依赖项注入工作,因为它总是以错误消息“lateinit property api尚未初始化”终止。我可以将问题简化为以下场景:存在一个接口 interface IApi { fun retrieveContent(): String } 这是由 class Api : IApi { override fun retrieveContent() = "Some Content" } 我想在另一个类中使用该实现,在该类中应该进行依赖

我没有让Kotlin中基于Spring的setter依赖项注入工作,因为它总是以错误消息“lateinit property 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()
}
在main函数中,我加载应用程序上下文并调用该方法:

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

    val controller = SomeController()
    controller.printReceivedContent()
}
fun main(args:Array){
val context=AnnotationConfigApplicationContext()
register(DIConfig::class.java)
context.refresh()
val controller=SomeController()
controller.printReceivedContent()
}

这里有什么问题?

通常将
@Autowired
添加到属性的setter中。因此,不应将其用于属性,而应显式注释setter:

@set:Autowired lateinit var api: IApi

如果您自己像那样调用构造函数,那么Spring就不会参与其中。与Java中相同

val controller = context.getBean(SomeController::class.java)
SpringFramework5.0添加了以下内容,因此您也可以编写

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

您的api目前不是spring管理的bean,请尝试用@Service或@Component注释它

不幸的是,这不起作用。像
lateinitvarapi:IApi@autowiredset
这样显式地注释setter也不起作用。谢谢!你描述它的方式。但是,在配置文件中,我需要添加以下bean定义:
@bean-open-fun-getSomeController()=SomeController()
有没有办法省略这个“不必要的”代码?