Programmatic Bean Registration

Registro programático de beans

Desde Spring Framework 7, existe compatibilidad de primera clase para el registro programático de beans mediante la interfaz BeanRegistrar. Puedes implementarla para registrar beans de forma programática, flexible y eficiente.

Normalmente, las implementaciones de registradores de beans se importan con la anotación @Import en clases @Configuration:

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

Puedes aprovechar anotaciones condicionales de nivel de tipo, como @Conditional y sus variantes, para importar condicionalmente los registradores de beans relacionados.

La implementación del registrador de beans utiliza las API BeanRegistry y Environment para registrar beans de forma programática, concisa y flexible. Por ejemplo, permite realizar registros personalizados dentro de expresiones if, bucles for y otras estructuras de control.

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("Descripción personalizada")
				.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();
	}
}

Los registradores de beans son compatibles con las optimizaciones Ahead of Time (AOT), tanto en la JVM como en imágenes nativas de GraalVM, incluso cuando se utilizan proveedores de instancias.