我目前正在使用Spring Boot开发Spring服务器应用程序。
我需要开发一个系统,其中一些InputStream将从本地File System
或FTP
或其他一些源发送到特定的InputStreamConsumer
实例,所有这些都配置在数据库。 InputStreamConsumer
已经是托管bean。
我的InputStreamProviders
可能是Prototype beans
。它们不会被其他bean使用,但是他们需要使用TaskScheduler
并定期将InputStreams
发送到他们的InputStreamConsumers。
长话短说,我需要使用Spring从外部配置中实例化Beans
列表。有没有办法做到这一点?
答案 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.
}
}
}