编程式 Bean 注册

从 Spring Framework 7 开始,通过 BeanRegistrar 接口提供了对编程式 bean 注册的一流支持,该接口可以实现以灵活高效的方式编程式注册 bean。

这些 bean 注册器实现通常通过 @Configuration 类上的 @Import 注解导入。

  • Java

  • Kotlin

@Configuration
@Import(MyBeanRegistrar.class)
class MyConfiguration {
}
@Configuration
@Import(MyBeanRegistrar::class)
class MyConfiguration {
}

您可以利用类型级别的条件注解 (@Conditional,以及其他变体) 来有条件地导入相关的 bean 注册器。

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

  • Java

  • Kotlin

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!")));
        }
    }
}
class MyBeanRegistrar : BeanRegistrarDsl({
    registerBean<Foo>()
    registerBean(
        name = "bar",
        prototype = true,
        lazyInit = true,
        description = "Custom description") {
            Bar(bean<Foo>())
    }
    profile("baz") {
        registerBean { Baz("Hello World!") }
    }
})

Bean 注册器支持 提前编译优化,无论是在 JVM 上还是使用 GraalVM 本机映像,包括在使用实例供应商时。