在没有xml配置的情况下,在地图/列表中使用大量的bean实例进行注入

时间:2019-03-19 12:26:21

标签: java spring dependency-injection

如何使用spring但不使用xml配置(我们应仅使用注释)将java bean的Map(或List)注入一些不同类的实例?我希望能够通过名称或实现类来指定要插入该映射的特定实例

实例将使用如下声明:

  

@Component(“ instanceA”)   公共类A实现了I {
  ...
  }

为简单起见,我们可以首先假设所有实例都实现相同的接口,但这并不总是正确的。

2 个答案:

答案 0 :(得分:0)

您可以使用bean工厂来访问所有必需的bean

@Autowired
private ListableBeanFactory beanFactory;

beansOfType.getBeansOfType()返回地图BeanName -> Bean

您只需要知道要“注入”的bean名称。 列出必要的BeanNames;

然后,您只能摄取必要的豆子。

Map<String, YourInterface> beansOfType = beanFactory.getBeansOfType(YourInterface.class);

List<YourInterface> necessaryBeanNames.stream().map(b-> beansOfType.get(b)).filter(b -> b != null).collect(toList());

答案 1 :(得分:0)

尚无可以为您完成此操作的注释,但是您可以使用@Bean和@Qualifier获得所需的结果。

@Bean
public List<YourInterface> getList(@Qualifier("yourCherryPickedInterfaceImpl1") YourInterface yourCherryPickedInterfaceImpl1, @Qualifier("yourCherryPickedInterfaceImpl2") YourInterface yourCherryPickedInterfaceImpl2) {
    return Arrays.asList(new YourInterface[]{yourCherryPickedInterfaceImpl1, yourCherryPickedInterfaceImpl2});
}