簡體   English   中英

獲取特定類型的Bean列表

[英]Get a List of Beans for a certain type

我有一類可以提供數據的類,還有一個用於注冊不同數據提供者的注冊表。 我正在尋找一種在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。

我不想采用的方法是使用自定義注釋,然后通過反射來解析所有類,實例化它們並將它們放入注冊表中。 但是目前,這是我看到的唯一方法,因此無需修改配置並手動連接服務。

如果您希望它們全部都自動接線,則只需自動接線接口實現列表即可。

@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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM