Spring 中使用 BeanRegistrar 實現程式化 Bean 註冊機制
瀏覽人數:5最近更新:
1.概述
Spring Bean 通常透過@Component
或@Bean
等註解以聲明方式註冊。但在某些情況下,我們需要比編者註冊更大的靈活性,例如,基於屬性註冊 Bean。
Spring 7 引入了BeanRegistrar
作為一項強大的新功能。
在本教程中,我們將了解BeanRegistrar
為何如此受歡迎,它與舊的註冊 Bean 的方式相比如何,以及如何在 Java 和 Kotlin 專案中使用它。
2. 為什麼我們需要新的東西
在 Spring 7 之前,我們已經可以透過BeanDefinitionRegistryPostProcessor
類型以程式設計方式註冊 Bean:
@Configuration
public class BeanRegistrationsSpring6Configuration {
@Bean
BeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor() {
return new BeanDefinitionRegistryPostProcessor() {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
var beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MyService.class);
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
registry.registerBeanDefinition("myService", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// No-op
}
};
}
}
雖然靈活,但它也有缺點:
- 它冗長且低級。
- 閱讀和測驗都很困難。
- 對原生鏡像(AOT)場景不友善。
3. 新的BeanRegistrar
類型
BeanRegistrar
是一個函數式接口,它允許我們以一種簡潔、聲明式且兼容原生的方式註冊 Bean。以下範例使用BeanRegistrar
以程式設計方式註冊了一個類型為MyService
且使用預設設定的 Bean,以及另一個名為「 myService2
」且使用原型作用域和延遲初始化的 Bean:
@Configuration
@Import(BeanRegistrationsConfiguration.MyBeanRegistrar.class)
public class BeanRegistrationsConfiguration {
static class MyBeanRegistrar implements BeanRegistrar {
@Override
public void register(BeanRegistry registry, Environment env) {
registry.registerBean(MyService.class);
registry.registerBean("myService2", MyService.class, spec -> spec
.prototype()
.lazyInit()
.primary()
);
}
}
}
要注意的是,BeanRegistrar 不能使用@Bean
樣式BeanRegistrar.
我們應該使用@Import
,因為 Bean 必須在 Spring 的配置處理過程中被發現。
4. Kotlin DSL 支持
對於 Kotlin,我們可以使用BeanRegistrarDsl
來獲得一流的支援。同樣的例子如下:
@Configuration
@Import(BeanRegistrationsConfiguration.MyBeanRegistrar::class)
class BeanRegistrationsConfiguration {
class MyBeanRegistrar : BeanRegistrarDsl({
registerBean<MyService>()
registerBean( name = "myService2", prototype = true, lazyInit = true ){
MyService()
}
})
}
5. 結論
在本文中,我們了解到BeanRegistrar
是一項功能,它允許我們以乾淨、聲明性和本機相容的方式註冊 Bean。
我們可以在GitHub 上的 Spring Framework 專案中找到有關此功能的原始討論。
與往常一樣,本文中提供的程式碼可在 GitHub 上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議