Как я могу создать коллекцию 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());
}
}
Но это похоже на действительно уродливый хак.