Browse Source
This commit adds the reference documentation for the new programmatic bean registration capabilities for both Java and Kotlin. Closes gh-18353pull/34552/head
3 changed files with 90 additions and 107 deletions
@ -0,0 +1,88 @@ |
|||||||
|
[[beans-java-programmatic-registration]] |
||||||
|
= Programmatic Bean Registration |
||||||
|
|
||||||
|
As of Spring Framework 7, a first-class support for programmatic bean registration is |
||||||
|
provided via the {spring-framework-api}/beans/factory/BeanRegistrar.html[`BeanRegistrar`] |
||||||
|
interface that can be implemented to register beans programmatically in a concise and |
||||||
|
flexible way. For example, it allows custom registration through an `if` expression, a |
||||||
|
`for` loop, etc. |
||||||
|
|
||||||
|
Those bean registrar implementations are typically imported with an `@Import` annotation |
||||||
|
on `@Configuration` classes. |
||||||
|
|
||||||
|
[tabs] |
||||||
|
====== |
||||||
|
Java:: |
||||||
|
+ |
||||||
|
[source,java,indent=0,subs="verbatim,quotes"] |
||||||
|
---- |
||||||
|
@Configuration |
||||||
|
@Import(MyBeanRegistrar.class) |
||||||
|
class MyConfiguration { |
||||||
|
} |
||||||
|
---- |
||||||
|
|
||||||
|
Kotlin:: |
||||||
|
+ |
||||||
|
[source,kotlin,indent=0,subs="verbatim,quotes"] |
||||||
|
---- |
||||||
|
@Configuration |
||||||
|
@Import(MyBeanRegistrar::class) |
||||||
|
class MyConfiguration { |
||||||
|
} |
||||||
|
---- |
||||||
|
====== |
||||||
|
|
||||||
|
NOTE: You can leverage type-level conditional annotations ({spring-framework-api}/context/annotation/Conditional.html[`@Conditional`], |
||||||
|
but also other variants) to conditionally import the related bean registrars. |
||||||
|
|
||||||
|
The bean registrar implementation uses {spring-framework-api}/beans/factory/BeanRegistry.html[`BeanRegistry`] and |
||||||
|
{spring-framework-api}/core/env/Environment.html[`Environment`] APIs to register beans programmatically in a concise |
||||||
|
and flexible way. |
||||||
|
|
||||||
|
[tabs] |
||||||
|
====== |
||||||
|
Java:: |
||||||
|
+ |
||||||
|
[source,java,indent=0,subs="verbatim,quotes"] |
||||||
|
---- |
||||||
|
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!"))); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
---- |
||||||
|
|
||||||
|
Kotlin:: |
||||||
|
+ |
||||||
|
[source,kotlin,indent=0,subs="verbatim,quotes"] |
||||||
|
---- |
||||||
|
class MyBeanRegistrar : BeanRegistrarDsl({ |
||||||
|
registerBean<Foo>() |
||||||
|
registerBean<Bar>( |
||||||
|
name = "bar", |
||||||
|
prototype = true, |
||||||
|
lazyInit = true, |
||||||
|
description = "Custom description") { |
||||||
|
Bar(bean<Foo>()) |
||||||
|
} |
||||||
|
profile("baz") { |
||||||
|
registerBean { Baz("Hello World!") } |
||||||
|
} |
||||||
|
}) |
||||||
|
---- |
||||||
|
====== |
||||||
|
|
||||||
|
NOTE: Bean registrars are supported with xref:core/aot.adoc[Ahead of Time Optimizations], |
||||||
|
either on the JVM or with GraalVM native images, including when instance suppliers are used. |
||||||
Loading…
Reference in new issue