对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

Bean 定义 DSL

Spring Framework 通过使用 lambda 支持以功能性方式注册豆子 作为XML或Java配置的替代方案(@Configuration@Bean).简而言之 它让你用一个lambda注册豆子,这个lambda作为一个工厂豆. 这种机制非常高效,因为它不需要任何反射或CGLIB代理。spring-doc.cadn.net.cn

在 Java 中,你可以写以下内容:spring-doc.cadn.net.cn

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 扩展, 你可以写以下内容:spring-doc.cadn.net.cn

class Foo

class Bar(private val foo: Foo)

val context = GenericApplicationContext().apply {
	registerBean<Foo>()
	registerBean { Bar(it.getBean()) }
}

当班级开始时酒吧只有一个构造子,你甚至可以直接指定 bean 类, 构造器参数将按类型自动接线:spring-doc.cadn.net.cn

val context = GenericApplicationContext().apply {
	registerBean<Foo>()
	registerBean<Bar>()
}

为了支持更声明式的方法和更简洁的语法,Spring Framework 提供了以下条件 a Kotlin bean 定义 DSL 它声明一个应用上下文初始化器通过一个干净的声明式API, 这样你就能处理配置文件和环境用于定制 豆子是如何注册的。spring-doc.cadn.net.cn

在以下示例中请注意:spring-doc.cadn.net.cn

  • 类型推断通常允许避免为豆子引用指定类型,例如参考(“bazBean”)spring-doc.cadn.net.cn

  • 可以使用Kotlin顶层函数声明豆子,使用可调用的引用,如bean(::我的路由器)在这个例子中spring-doc.cadn.net.cn

  • 在指定时豆<条>()bean(::我的路由器)参数按类型自动接线spring-doc.cadn.net.cn

  • FooBar只有当福巴尔个人资料已激活spring-doc.cadn.net.cn

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构造。

然后你可以用这个豆()函数用于在应用上下文中注册豆子, 如下示例所示:spring-doc.cadn.net.cn

val context = GenericApplicationContext().apply {
	myBeans.initialize(this)
	refresh()
}
Spring Boot 基于 JavaConfig,尚未提供功能性豆定义的具体支持 但你可以通过 Spring Boot 实验性地使用函数式豆的定义应用上下文初始化器支持。 更多细节和最新信息请参见Stack Overflow的回答。另见Spring Fu孵化器开发的实验性Kofu DSL。