2017-08-29 91 views
2

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。但是,此示例仅使用普通弹簧而不是弹簧引导。任何提示如何使用DSL一起使用弹簧启动赞赏。如何使用Spring Boot和Spring WebFlux的“功能bean定义Kotlin DSL”?

+0

你刚刚试过了吗?把这个bean的定义放到一个控制器中(这是通过spring引导发现的)? – guenhter

+1

是的,我尝试了一个'@ Configuration'类和'@ Bean'方法,返回'beans {...}'的结果。然后我得到异常'“...没有可用的'...'类型的可用bean ...”'当我移除@ @ Service'并在上面的'beans {...}'lambda中声明服务类时。 –

回答

7

Spring Boot基于Java Config,但应允许通过ApplicationContextInitializer支持用户定义的functional bean declaration DSL的实验性支持,如here所述。

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

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

然后以使其在账户被启动运行main()和测试时拍摄,创建一个ApplicationContextInitializer类如下:

class BeansInitializer : ApplicationContextInitializer<GenericApplicationContext> { 

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

} 

最终,在你的application.properties文件中声明这个初始化:

context.initializer.classes=com.example.BeansInitializer 

你会发现一个完整的例子here,也可以按照this issue关于功能性bean注册的专用Spring Boot支持。

+0

有关您的答案的两个问题: *此初始化将由测试设置使用具有JUnit的'SpringRunner'选取,对吧? *有没有其他方式可以在不创建'properties'文件的情况下产生这种行为,包括在测试中拾取这个初始化? 谢谢! –

相关问题