Spring 如何将IoC注入Kotlin顶级功能?我甚至使用IoC容器吗?
我跟不上FP。当人们说“更惯用的风格”时,我必须理解:99%的Java库不适用于Kotlin和Scala的FP惯用风格,对吗?嗯,我需要弹簧靴,以便用Vaadin快速启动。所以我需要注射一些豆子Spring 如何将IoC注入Kotlin顶级功能?我甚至使用IoC容器吗?,spring,dependency-injection,functional-programming,inversion-of-control,kotlin,Spring,Dependency Injection,Functional Programming,Inversion Of Control,Kotlin,我跟不上FP。当人们说“更惯用的风格”时,我必须理解:99%的Java库不适用于Kotlin和Scala的FP惯用风格,对吗?嗯,我需要弹簧靴,以便用Vaadin快速启动。所以我需要注射一些豆子 package com.x.ui import com.vaadin.icons.VaadinIcons import com.vaadin.navigator.Navigator import com.vaadin.ui.MenuBar fun createMenuBar(navigator: N
package com.x.ui
import com.vaadin.icons.VaadinIcons
import com.vaadin.navigator.Navigator
import com.vaadin.ui.MenuBar
fun createMenuBar(navigator: Navigator): MenuBar {
val menuBar = MenuBar()
menuBar.setHeight(null)
menuBar.setWidth(null)
menuBar.addItem("Dashboard", VaadinIcons.COG,
{ navigator.navigateTo("Dashboard") } as MenuBar.Command)
return menuBar
}
那么在这种情况下,我如何将SpringNavigator
注入到这个函数中呢
由于到目前为止我有两个顶级函数,所以我既没有@Component,也没有@Bean,对于Kotlin来说,使用SpringIOC的惯用方法是什么?我是否仅限于使用类,或者我们有一些技巧来实现它?问题是您有一个带有签名的函数
(Navigator)->菜单栏
,但您可能需要的是一个带有签名的函数()->菜单栏
通常,在OO中,您可以通过将Navigator
注入构造函数,保存引用,然后在调用函数时使用它来实现这一点
在函数式编程中,类似的概念称为“部分函数应用”。这是指将参数预应用于函数,并创建一个新函数以获取其余参数。在本例中,我们希望预先应用导航器
,它将为我们留下()->菜单栏
的签名
看起来是一篇关于Kotlin概念的好文章
我建议你试试这样的东西:
// note - returns `() -> MenuBar` now, rather than `MenuBar`
fun createMenuBar(navigator: Navigator): () -> MenuBar {
// returning a function that takes no parameters
return { ->
val menuBar = MenuBar()
menuBar.setHeight(null)
menuBar.setWidth(null)
menuBar.addItem("Dashboard", VaadinIcons.COG,
{ navigator.navigateTo("Dashboard") } as MenuBar.Command)
return menuBar
}
}
顶级函数相当于Java静态方法。我不确定这是否有意义,或者将依赖注入到它们中是否是一个好的实践。作为一个好的实践,我建议您将这些函数放在一个用依赖注入配置的类中。