2017-08-15 135 views
0

我有一種類型的可以提供數據和註冊表的不同數據提供者註冊的類。我正在尋找一種優雅的方式來實現這一點在春季啓動。 我當前的實現看起來像這樣(代碼縮短爲簡潔起見):獲取特定類型的豆列表

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最可能不是正確的工具,我的問題更多的是關於春天,如果有一個我不知道實現這個目標的好方法。 作爲示例使用限定符對它們進行註釋,然後在註冊表中使用該限定符解析所有Beans。

我不想採取的方式是使用自定義註釋,然後通過反射解析所有類,實例化它們並將它們放入註冊表中。但目前,這是我能看到的唯一方法,所以我不必修改配置並手動傳送這些服務。

+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