Kotlin с Spring DI: свойство lateinit не было инициализировано

Я не получаю инъекцию зависимостей зависимостей Spring-based setter в Kotlin, чтобы работать, поскольку она всегда заканчивается сообщением об ошибке «свойство 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() } 

В чем проблема?

Весна не задействована, если вы просто так называете конструктор. То же, что и в Java,

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

Spring Framework 5.0 добавляет расширения Kotlin , поэтому вы также можете написать либо один из

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

@Autowired обычно добавляется к @Autowired свойства. Поэтому вместо того, чтобы использовать его для свойства, вы должны явно аннотировать установщик:

 @set:Autowired lateinit var api: IApi