|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
Bean 定义 DSL
Spring Framework 通过使用 lambda 支持以功能性方式注册豆子
作为XML或Java配置的替代方案(@Configuration和@Bean).简而言之
它让你用一个lambda注册豆子,这个lambda作为一个工厂豆.
这种机制非常高效,因为它不需要任何反射或CGLIB代理。
在 Java 中,你可以写以下内容:
class Foo {}
class Bar {
private final Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
}
GenericApplicationContext context = new GenericApplicationContext();
context.registerBean(Foo.class);
context.registerBean(Bar.class, () -> new Bar(context.getBean(Foo.class)));
在Kotlin中,具有实体化型参数和通用应用上下文Kotlin 扩展,
你可以写以下内容:
class Foo
class Bar(private val foo: Foo)
val context = GenericApplicationContext().apply {
registerBean<Foo>()
registerBean { Bar(it.getBean()) }
}
当班级开始时酒吧只有一个构造子,你甚至可以直接指定 bean 类,
构造器参数将按类型自动接线:
val context = GenericApplicationContext().apply {
registerBean<Foo>()
registerBean<Bar>()
}
为了支持更声明式的方法和更简洁的语法,Spring Framework 提供了以下条件
a Kotlin bean 定义 DSL 它声明一个应用上下文初始化器通过一个干净的声明式API,
这样你就能处理配置文件和环境用于定制
豆子是如何注册的。
在以下示例中请注意:
-
类型推断通常允许避免为豆子引用指定类型,例如
参考(“bazBean”) -
可以使用Kotlin顶层函数声明豆子,使用可调用的引用,如
bean(::我的路由器)在这个例子中 -
在指定时
豆<条>()或bean(::我的路由器)参数按类型自动接线 -
这
FooBar只有当福巴尔个人资料已激活
class Foo
class Bar(private val foo: Foo)
class Baz(var message: String = "")
class FooBar(private val baz: Baz)
val myBeans = beans {
bean<Foo>()
bean<Bar>()
bean("bazBean") {
Baz().apply {
message = "Hello world"
}
}
profile("foobar") {
bean { FooBar(ref("bazBean")) }
}
bean(::myRouter)
}
fun myRouter(foo: Foo, bar: Bar, baz: Baz) = router {
// ...
}
该DSL是程序化的,意味着它允许对豆子进行自定义注册逻辑
通过一个如果表达式,a为循环,或任何其他Kotlin构造。 |
然后你可以用这个豆()函数用于在应用上下文中注册豆子,
如下示例所示:
val context = GenericApplicationContext().apply {
myBeans.initialize(this)
refresh()
}
Spring Boot 基于 JavaConfig,尚未提供功能性豆定义的具体支持
但你可以通过 Spring Boot 实验性地使用函数式豆的定义应用上下文初始化器支持。
更多细节和最新信息请参见Stack Overflow的回答。另见Spring Fu孵化器开发的实验性Kofu DSL。 |