私は、データを提供できる特定のタイプのクラスと、異なるデータプロバイダが登録されているレジストリを持っています。私は春のブートでこれを実装するエレガントな方法を探しています。配線部分のために今すぐ特定のタイプのBeansのリストを取得する
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は、1つのタイプに対して1つずつ異なる実装を提供するためのものです。だから、DIはおそらく正しいツールではありません、私はこれを達成するためには分かりません。 例として、それらを修飾子で注釈を付けて、すべてのBeanをレジストリ内のその修飾子で解決します。
カスタムAnnotationを使用し、すべてのクラスをリフレクションで解決し、インスタンス化してレジストリに配置する方法はありません。しかし、現時点では私が見ることができる唯一の方法なので、設定を修正してサービスをハンドリングする必要はありません。
は「エレガント」はあなたに何を意味するかを定義しますか?他にもいくつかの方法がありますが、どのような優雅なソリューションがあなたにとって意味するものかはわかりません。すべてのプロバイダが自動的に登録されることを期待していますか、それとも制御したいですか? –