我有一种类型的类可以提供数据和注册表,其中注册了不同的数据提供者。我正在寻找一种优雅的方式来实现春季启动。 我当前的实现看起来像这样(代码简化为了简洁):
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很可能不是正确的工具,我的问题更多的是关于春天,如果有一个很好的方式,我不知道实现这一点。 例如,使用限定符对它们进行注释,然后在注册表中使用该限定符解析所有Bean。
我不想采用的方法是使用自定义Annotation,然后通过反射解析所有类,实例化它们并将它们放入注册表中。但目前这是我能看到的唯一方式,所以我不必修改配置并手工处理服务。
答案 0 :(得分:0)
如果您希望所有这些都是自动装配的,您只需自动装配一个接口实现列表。
@Bean
public class Provider1 implements DataProvider { ... }
@Bean
public class Provider2 implements DataProvider { ... }
@Bean
public class Registry{
@Autowired
private List<DataProvider> providers;
public List<DataProvider> getProviders(){
//return providers
}
public Data someAggregatedOperation(){ ... }
}
如果您想继续使用配置类,可以执行以下操作:
@Bean
public class Provider1 implements DataProvider { ... }
@Bean
public class Provider2 implements DataProvider { ... }
public class Registry{
private List<DataProvider> providers;
public Registry(final List<DataProvider> providers) {
this.providers = providers;
}
public List<DataProvider> getProviders(){
//return providers
}
public Data someAggregatedOperation(){ ... }
}
@Configuration
public class MyAppConfiguration{
@Bean
@Autowired
public Registry providerRegistry(final List<DataProvider> providers){
return new Registry(providers);
}
}