Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use "Functional bean definition Kotlin DSL" with Spring Boot and Spring WebFlux?

At https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt the comment shows how to define Spring Beans via the new "Functional bean definition Kotlin DSL". I also found https://github.com/sdeleuze/spring-kotlin-functional. However, this example uses just plain Spring and not Spring Boot. Any hint how to use the DSL together with Spring Boot is appreciated.

like image 985
Juergen Zimmermann Avatar asked Aug 29 '17 09:08

Juergen Zimmermann


3 Answers

Spring Boot is based on Java Config, but should allow experimental support of user-defined functional bean declaration DSL via ApplicationContextInitializer support as described here.

In practice, you should be able to declare your beans for example in a Beans.kt file containing a beans() function.

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

Then in order to make it taken in account by Boot when running main() and tests, create an ApplicationContextInitializer class as following:

class BeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {

    override fun initialize(context: GenericApplicationContext) =
        beans().initialize(context)

}

And ultimately, declare this initializer in your application.properties file:

context.initializer.classes=com.example.BeansInitializer  

You will find a full example here and can also follow this issue about dedicated Spring Boot support for functional bean registration.

like image 144
Sébastien Deleuze Avatar answered Sep 18 '22 20:09

Sébastien Deleuze


Another way to do it in Spring Boot would be :

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args) {
        addInitializers(
                beans {
                    // Define your bean with Kotlin DSL here
                }
        )
    }
}
like image 20
fg78nc Avatar answered Sep 20 '22 20:09

fg78nc


You can define your beans in *Config.kt file and implement initalize method of ApplicationContextInitializer interface.

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

Some bean definition here.

bean<XServiceImpl>("xService")

bean("beanName") {
        BeanConstructor(ref("refBeanName"))
}
like image 42
Ugur Artun Avatar answered Sep 20 '22 20:09

Ugur Artun