使用@Configuration在春季创建豆类集合
2022-09-01 23:47:57
我如何创建一个bean集合,这些bean将由Spring使用具有@Configuration注释的类进行正确管理。
我想做这样的事情:
@Configuration
public Config {
@Autowired
private SomeConfiguration config;
@Bean
public List<MyBean> myBeans() {
List<MyBean> beans = new ArrayList<MyBean>();
for (Device device : config.getDevices()) {
beans.add(new MyBean(device));
}
return beans;
}
}
但 MyBean 实例不会进行后处理。因此,它们的@Autowired方法不被调用,豆子没有被注册为mbeans等。但是,该列表是可访问的,因此我可以自动连接MyBean对象列表。
我不能使用类似的东西:
@Configuration
public Config {
@Autowired
private SomeConfiguration config;
@Bean
public MyBean myBean1() { ... }
@Bean
public MyBean myBean2() { ... }
}
由于 MyBean 实例的数量在运行时之前是未知的。我想这样做的原因是因为我们控制着一台具有可变数量组件的物理机器。我想每个组件有一个豆子。
我目前正在通过使用BeanFactoryPostProcessor来实现我们的目标,如下所示:
@Component
public class MyBeansFactoryPostProcessor implements BeanFactoryPostProcessor {
@Autowired
private SomeConfiguration config;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeanException {
for (Device device : config.getDevices()) {
createAndRegister(BeanDefinitionRegistry) beanFactory, device);
}
}
private void createAndRegister(BeanDefinitionRegistry registry, Device device) {
register.registerBeanDefinition("device" + device.getId(), BeanDefinitionBuilder.genericBeanDefinition(MyBean.class).addConstructorArgValue(device).getBeanDefinition());
}
}
但这感觉就像一个非常丑陋的黑客。