繁体   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