Spring Boot从数据库配置创建托管原型bean列表

时间:2015-02-25 08:33:04

标签: spring spring-bean

我目前正在使用Spring Boot开发Spring服务器应用程序。

我需要开发一个系统,其中一些InputStream将从本地File SystemFTP或其他一些源发送到特定的InputStreamConsumer实例,所有这些都配置在数据库。 InputStreamConsumer已经是托管bean。

我的InputStreamProviders可能是Prototype beans。它们不会被其他bean使用,但是他们需要使用TaskScheduler并定期将InputStreams发送到他们的InputStreamConsumers。

长话短说,我需要使用Spring从外部配置中实例化Beans列表。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

好的,感谢@Ralph在他的评论(How do I create beans programmatically in Spring Boot?)中提到的链接,我设法做了我想做的事。

我正在使用@Configuration class InputStreamProviderInstantiator implements BeanFactoryAware

该帖子未提及如何处理@Autowire个实例中的InputStreamProvider注释,因此我在此处发布如何操作:

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class InputStreamProviderInitializer implements BeanFactoryAware {

    private AbstractAutowireCapableBeanFactory factory;
    @Inject
    InputStreamProviderConfigurationRepository configurationRepository;

    @Override
    public void setBeanFactory(BeanFactory factory) {
        Assert.state(factory instanceof AbstractAutowireCapableBeanFactory, "wrong bean factory type");
        this.factory = (AbstractAutowireCapableBeanFactory) factory;
    }

    @PostConstruct
    private void initializeInputStreamProviders() {
         for (InputStreamProviderConfigurationEntity configuration : configurationRepository.findAll()) {
             InputStreamProvider provider = // PROVIDER CREATION, BLAH, BLAH, BLAH
             String providerName = "inputStreamSource"+configuration.getId();
             factory.autowireBean(provider);
             factory.initializeBean(source, providerName);
             factory.registerSingleton(providerName, source); // I don't think it's mandatory since the providers won't be called by other beans.
         }
    }
}