2017-08-29 83 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'文件的情況下產生這種行爲,包括在測試中拾取這個初始化? 謝謝! –

相關問題