如何将"Functional bean definition Kotlin DSL"与Spring Boot和Spring WebFlux一起使用?



在 https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt,注释显示了如何通过新的"函数式bean定义Kotlin DSL"来定义Spring Beans。我也找到了 https://github.com/sdeleuze/spring-kotlin-functional。但是,此示例仅使用普通Spring 而不是Spring Boot。任何有关如何将DSL与SpringBoot一起使用的提示都值得赞赏。

SpringBoot 基于 Java Config,但应该允许通过此处描述的ApplicationContextInitializer支持对用户定义的函数式 Bean 声明 DSL 进行实验性支持。

在实践中,您应该能够在包含beans()函数的Beans.kt文件中声明您的 bean。

fun beans() = beans {
// Define your bean with Kotlin DSL here
}

然后,为了使 Boot 在运行main()和测试时考虑到它,请创建一个ApplicationContextInitializer类,如下所示:

class BeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
override fun initialize(context: GenericApplicationContext) =
beans().initialize(context)
}

最后,在application.properties文件中声明此初始值设定项:

context.initializer.classes=com.example.BeansInitializer  

您将在此处找到一个完整的示例,也可以关注有关函数式 Bean 注册的专用 Spring 引导支持的问题。

在 Spring Boot 中执行此操作的另一种方法是:

fun main(args: Array<String>) {
runApplication<DemoApplication>(*args) {
addInitializers(
beans {
// Define your bean with Kotlin DSL here
}
)
}
}

您可以在 *Config.kt 文件中定义您的 bean,并实现ApplicationContextInitializer接口的初始化方法。

override fun initialize(applicationContext: GenericApplicationContext) {
....
}

这里有一些豆子定义。

bean<XServiceImpl>("xService")
bean("beanName") {
BeanConstructor(ref("refBeanName"))
}

最新更新