2017-08-15 8 views
0

私は、データを提供できる特定のタイプのクラスと、異なるデータプロバイダが登録されているレジストリを持っています。私は春のブートでこれを実装するエレガントな方法を探しています。配線部分のために今すぐ特定のタイプの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を使用し、すべてのクラスをリフレクションで解決し、インスタンス化してレジストリに配置する方法はありません。しかし、現時点では私が見ることができる唯一の方法なので、設定を修正してサービスをハンドリングする必要はありません。

+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); 
    } 
} 
+0

それは私が探していたものでした。私は本当にそこに脳の結び目を持っていた。私はおそらくあなたがリストをautowireすることができると思ったが、 "それは同じタイプの複数の豆を宣言することはできませんので、それはできません" DIはそれを処理することはできません "しかし、同じクラスであり、修飾されていませんが、インタフェースではありません....ありがとう – Tom

関連する問題