获取特定类型的豆类列表

时间:2017-08-15 15:15:19

标签: java spring spring-boot dependency-injection

我有一种类型的类可以提供数据和注册表,其中注册了不同的数据提供者。我正在寻找一种优雅的方式来实现春季启动。 我当前的实现看起来像这样(代码简化为了简洁):

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,然后通过反射解析所有类,实例化它们并将它们放入注册表中。但目前这是我能看到的唯一方式,所以我不必修改配置并手工处理服务。

1 个答案:

答案 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);
    }
}