此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

编程式 Bean 注册

自 Spring Framework 7 起,通过 BeanRegistrar 接口提供了对编程式 Bean 注册的一流支持,该接口可被实现,以便以灵活且高效的方式编程式地注册 Bean。spring-doc.cadn.net.cn

这些 Bean 注册器实现通常通过在 @Import 类上使用 @Configuration 注解进行导入。spring-doc.cadn.net.cn

@Configuration
@Import(MyBeanRegistrar.class)
class MyConfiguration {
}
@Configuration
@Import(MyBeanRegistrar::class)
class MyConfiguration {
}
您可以利用类型级别的条件注解(@Conditional, 以及其他变体)来有条件地导入相关的 Bean 注册器。

Bean 注册器实现使用 BeanRegistryEnvironment API,以简洁灵活的方式编程式地注册 Bean。例如,它允许通过 if 表达式、 for 循环等方式进行自定义注册。spring-doc.cadn.net.cn

class MyBeanRegistrar implements BeanRegistrar {

	@Override
	public void register(BeanRegistry registry, Environment env) {
		registry.registerBean("foo", Foo.class);
		registry.registerBean("bar", Bar.class, spec -> spec
				.prototype()
				.lazyInit()
				.description("Custom description")
				.supplier(context -> new Bar(context.bean(Foo.class))));
		if (env.matchesProfiles("baz")) {
			registry.registerBean(Baz.class, spec -> spec
					.supplier(context -> new Baz("Hello World!")));
		}
		registry.registerBean(MyRepository.class);
		registry.registerBean(RouterFunction.class, spec ->
				spec.supplier(context -> router(context.bean(MyRepository.class))));
	}

	RouterFunction<ServerResponse> router(MyRepository myRepository) {
		return RouterFunctions.route()
				// ...
				.build();
	}

}
class MyBeanRegistrar : BeanRegistrarDsl({
	registerBean<Foo>()
	registerBean(
		name = "bar",
		prototype = true,
		lazyInit = true,
		description = "Custom description") {
		Bar(bean<Foo>()) // Also possible with Bar(bean())
	}
	profile("baz") {
		registerBean { Baz("Hello World!") }
	}
	registerBean<MyRepository>()
	registerBean {
		myRouter(bean<MyRepository>()) // Also possible with myRouter(bean())
	}
})

fun myRouter(myRepository: MyRepository) = router {
	// ...
}
Bean 注册器支持预先优化(Ahead of Time Optimizations), 无论是在 JVM 上还是使用 GraalVM 原生镜像时均受支持,包括使用实例供应器(instance suppliers)的情况。