如何創建一個由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