@Autowire接口是否可以作为Map <String,InterfaceName>?

时间:2019-10-07 21:01:04

标签: java spring-boot autowired

假设我有一个“ SomeInterface”,并且我有两个实现该“ SomeInterface”的springComponentImpl。

我知道我可以使用以下方法一次将两个实现自动关联在一起:

@Autowire
private List<SomeInterface> springComponentsImplList;

我可以用这种方式注入它们吗?:

@Autowire
private Map<String,SomeInterface> springComponentsImplList;

这样,我可以通过“键”获得实现?如果该键是类名或类似的东西并且是自动生成的,那将是完美的。

谢谢!

2 个答案:

答案 0 :(得分:3)

以下内容应该是开箱即用的,其中映射将bean名称包含为键,并将相应的bean实例包含为值:

@Autowired
private Map<String, Foo> allBeansOfType;

但是您也可以尝试使用ListableBeanFactory获取特定类型的所有bean实例及其名称:

private Map<String, Foo> allBeansOfType;

@Autowired
public MyClass(ListableBeanFactory beanFactory) {
    this.allBeansOfType = beanFactory.getBeansOfType(Foo.class);
}

答案 1 :(得分:0)

您可以将四季豆分别注入两个List

第一种方法::如果只有它们,则以不同的名称命名并使用@Qualifier

服务界面

public interface ServiceInterf {

}

ImplementOne

@Service("implementOne")
public class ImplementOne implements ServiceInterf {

}

实现二

@Service("implementTwo")
public class ImplementTwo implements ServiceInterf {

}

您可以使用@Qualifier

@Autowired
@Qualifier("implementOne")
private List<ServiceInterf> implementOne;

@Autowired
@Qualifier("implementTwo")
private List<ServiceInterf> implementTwo;

第二种方法::如果有多个,则可以使用@Qualifier 5.2. Using @Qualifier to Select Beans

在配置类中声明它们
@Bean
@Qualifier("implementOne")
public ServiceInterf getServiceInterf1() {
    return new ImplementOne();
}

@Bean
@Qualifier("implementOne")
public ServiceInterf getServiceInterf2() {
    return new ImplementOne();
}

@Bean
@Qualifier("implementTwo")
public ServiceInterf getServiceInterf3() {
    return new ImplementTwo();
}

@Bean
@Qualifier("implementTwo")
public ServiceInterf getServiceInterf4() {
    return new ImplementTwo();
}

如果您想将它们放入Map,请使用构造函数注入

private Map<String, List<ServiceInterf>> mapOfLists;

@Autowired
public TestMap(@Qualifier("implementOne") List<ServiceInterf> implementOne, 
               @Qualifier("implementTwo") List<ServiceInterf> implementTwo) {
    mapOfLists = Map.of("implementOne",implementOne,"implementTwo",implementTwo);  
    // Map.of is from java 9 

}