如何使用带有@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 没有注册为 mbean 等等。但是该列表是可访问的,因此我可以 Autowiring 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());
}
}
但这感觉就像一个非常丑陋的黑客攻击。
最佳答案
为了注入(inject)您的 MyBean 列表,请尝试使用 @Resource 而不是 @Autowired。例如
@Resource
public List<MyBean> myBeans
关于java - 在 Spring 中使用 @Configuration 创建一个 bean 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144640/