プログラムによる Bean 登録
Spring Framework 7 以降では、プログラムによる Bean 登録のファーストクラスのサポートが BeanRegistrar (Javadoc) インターフェースを介して提供され、これを実装することで、柔軟かつ効率的な方法で Bean をプログラムで登録できます。
これらの Bean レジストラ実装は通常、@Configuration クラスの @Import アノテーションを使用してインポートされます。
Java
Kotlin
@Configuration
@Import(MyBeanRegistrar.class)
class MyConfiguration {
}@Configuration
@Import(MyBeanRegistrar::class)
class MyConfiguration {
} 型レベルの条件付きアノテーション ( @Conditional (Javadoc) だけでなく他のバリアントも) を活用して、関連する Bean レジストラを条件付きでインポートできます。 |
Bean レジストラ実装では、BeanRegistry (Javadoc) および Environment (Javadoc) 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!")));
}
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 レジストラは、インスタンスサプライヤーが使用される場合を含め、JVM 上または GraalVM ネイティブイメージのいずれかで事前の最適化によってサポートされます。 |