如何创建一个由Spring使用具有@Configuration注释的类正确管理的bean集合。使用@Configuration在Spring中创建bean集合
我愿做这样的事情:
@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方法没有被调用,bean没有被注册为mbeans等。然而,这个列表是可访问的,这样我就可以自动装载MyBean对象列表。
我不能使用类似:
@Configuration
public Config {
@Autowired
private SomeConfiguration config;
@Bean
public MyBean myBean1() { ... }
@Bean
public MyBean myBean2() { ... }
}
由于为myBean的实例数运行之前不知道。我想这样做的原因是因为我们正在控制具有可变数量组件的物理机器。我想每个组件都有一个bean。
我目前使用的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());
}
}
但这只是感觉像一个真正的丑陋的黑客。
对于这个并不罕见的用例,仍然不能接受和很好的回答吗?太疯狂了。 – sebnukem 2018-02-06 02:31:27