【发布时间】:2017-08-15 15:15:18
【问题描述】:
我有一种可以提供数据的类和一个注册不同数据提供者的注册表。我正在寻找一种优雅的方式来在 Spring Boot 中实现这一点。 我当前的实现看起来像这样(为简洁起见,代码被缩短):
public interface DataProvider{
Data getSomeData();
}
public class Registry{
public register(DataProvider provider){
//add to internal list
};
public List<DataProvider> getProviders(){
//return providers
}
public Data someAggregatedOperation(){ ... }
}
public class Provider1 implements DataProvider { ... }
public class Provider2 implements DataProvider { ... }
现在是接线部分,这是我想改成更优雅的部分:
@Configuration
public class MyAppConfiguration{
@Bean
public Registry providerRegistry(){
Registry reg = new Registry();
reg.register(new Provider1());
reg.register(new Provider2());
return reg;
}
}
然后我可以将注册表注入到需要对服务进行操作的其他类中。
我知道 DI 用于为单一类型提供不同的实现,但一次只提供一个。所以 DI 很可能不是正确的工具,我的问题更多是关于 spring,如果有一个我不知道的好方法来实现这一点。 例如,使用限定符对它们进行注释,然后在注册表中使用该限定符解析所有 Bean。
我不想采用的方法是使用自定义注释,然后通过反射解析所有类,实例化它们并将它们放入注册表中。但目前这是我能看到的唯一方法,所以我不必修改配置和手动连接服务。
【问题讨论】:
-
定义“优雅”对您意味着什么?还有其他一些方法可以做到这一点,但我不知道优雅的解决方案对您意味着什么。您希望所有提供商自动注册还是要控制它?
标签: java spring spring-boot dependency-injection