java - 在 Spring 中使用 @Configuration 创建一个 bean 集合

标签 java spring configuration collections annotations

如何使用带有@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/

相关文章:

java - 在 Eclipse 中运行 Java REST API

c# - 为什么自定义配置部分的 StringValidator 总是失败?

configuration - 如何从起始页的“最近的项目”列表中删除项目?

java - 无法使用注释更改 Hibernate 3.6.10 上的序列名称 (Oracle 10g)

java - Spring boot 测试 API 和存储库的多个类

Android 在每次配置更改时启动一个异步任务

java - 尝试检查猜​​测是否为空时收到异常

java - 通过过滤显示或隐藏 HashMap 标记

java - 是什么导致我的 LWJGL 程序帧速率低?

java - 使用新的 java.time API 解析时区非常慢