你可以实施BeanDefinitionRegistryPostProcessor界面 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/support/BeanDefinitionRegistryPostProcessor.html注册BeanClass
beans的定义如下:
public class DynamicBeanDefinitionRegistrar implements BeanDefinitionRegistryPostProcessor {
public static final String PROPERTIES_PREFIX = "beans";
private final List<String> beanNames;
public DynamicBeanDefinitionRegistrar(Environment environment) {
beanNames =
Binder.get(environment)
.bind(PROPERTIES_PREFIX, Bindable.listOf(String.class))
.orElseThrow(IllegalStateException::new);
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
beanNames.forEach(
beanName -> {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(BeanClass.class);
beanDefinition.setInstanceSupplier(() -> new BeanClass(beanName));
registry.registerBeanDefinition(beanName, beanDefinition);
});
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {}
}
由于在实例化bean之前需要属性,因此要注册BeanClass
豆类的定义,@ConfigurationProperties
不适合这种情况。反而,活页夹API https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes#configuration-property-binding用于以编程方式绑定它们。
Because BeanDefinitionPostProcessor
对象必须在容器生命周期的早期实例化,@Bean
方法应标记为静态@Configuration
类,根据Spring文档 https://docs.spring.io/spring-framework/docs/5.0.x/javadoc-api/org/springframework/context/annotation/Bean.html.
@Configuration
public class DynamicBeanDefinitionRegistrarConfiguration {
@Bean
public static DynamicBeanDefinitionRegistrar beanDefinitionRegistrar(Environment environment) {
return new DynamicBeanDefinitionRegistrar(environment);
}
}
结果,您定义的所有 beanapplication.yml
,注册为BeanClass
beans:
beans:
- fooBean
- barBean
以供参考:使用 BeanDefinitionRegistryPostProcessor 创建 N 个 Bean https://stackoverflow.com/questions/53462889/create-n-number-of-beans-with-beandefinitionregistrypostprocessor, 从属性文件创建 Spring Boot 动态 Bean https://stackoverflow.com/questions/48161636/spring-boot-dynamic-bean-creation-from-properties-file