Могу ли я использовать @autowire (spring-context) для настольного приложения kotlin?

Я пытаюсь использовать Spring DI для настольного приложения kotlin-javafx, но Spring не вводит bean-компоненты в свойство lateinit.

Вот мой стартовый класс

package ui @Component class Starter : Application() { override fun start(primaryStage: Stage?) { val root : Parent = FXMLLoader.load(javaClass.getResource("/view/main.fxml")) primaryStage?.title = "Title" primaryStage?.scene = Scene(root) primaryStage?.show() } companion object { @JvmStatic fun main(args: Array<String>) { AnnotationConfigApplicationContext(SpringConfig::class.java) launch(Starter::class.java, *args) } } } 

Вот мой класс Spring-config

 package config @Configuration @ComponentScan(basePackages = arrayOf("domain", "ui")) open class SpringConfig { } 

Вот мой боб, который я хочу ввести

 package domain @Component open class State { private val coinsState = mapOf(Coin.SYS to CoinState(Coin.SYS)) fun setActiveForCoin(coin : Coin, isActive : Boolean) { val coin = coinsState[coin] if (coin == null) throw IllegalArgumentException("Coin $coin does not exist!") coin.isActive = isActive } } 

и, наконец, мой контроллер javafx, который должен получить компонент (экземпляр контроллера, созданного автоматически, я просто настраиваю его имя в файле .fxml)

 package ui.controller @Component class CoinController { @Autowired private lateinit var state : State @FXML fun showConfirmDialog(actionEvent: ActionEvent) { println(state) val alert = Alert(AlertType.CONFIRMATION) alert.title = "Confirmation Dialog" alert.headerText = "Look, a Confirmation Dialog" //alert.contentText = "Are you ok with this?" val result = alert.showAndWait() if (result.get() == ButtonType.OK) { // ... user chose OK } else { // ... user chose CANCEL or closed the dialog } } } 

Взгляните на GluonHQ Ignite и afterburner.fx . Они предназначены для предоставления возможностей DI вашему приложению JavaFX. Обычно я предпочитаю первый, потому что он позволяет вам вводить все рамки DI, которые вы выбираете.

Простая конфигурация приложения с зажиганием будет выглядеть так:

 class Starter: Application() { private val context = SpringContext(this) { listOf() /* collection of packages to scan for bean definitions */ } @Autowired private lateinit var loader: FXMLLoader override fun start(primaryStage: Stage) { context.init() /* ... now your FXML controllers can use autowiring */ } } 
Intereting Posts
Как реорганизовать представление, чтобы разрешить фильтрацию элементов, привязанных к наблюдаемомуArrayList, внутри приложения tornadofx Kotlin: доступ к параметру when-statement Как работать с большим количеством в Android Kotlin Apps? JaCoCo возвращается 0% Покрытие с Kotlin и Android 3.0 Могу ли я расширить на Java класс делегирования Kotlin? Kotlin: Как получить доступ к методам get и setValue для делегата? Как установить заголовок NavigationView с помощью Anko DSL? Android Things UserSensor.Builder – не удалось создать драйвер датчика расстояния Невозможно найти сеттер для поля – используя базу данных Kotlin с комнатой SearchView всегда расширялся, на панели инструментов? Не удается реализовать интерфейс kotlin Отражение Котлина недоступно Ошибка при создании объекта реализует интерфейс: класс не имеет конструктора Android посыльный – писать с нулевым длинным Kotlin лямбда с интерфейсом как аргумент