假设我有一个“ SomeInterface”,并且我有两个实现该“ SomeInterface”的springComponentImpl。
我知道我可以使用以下方法一次将两个实现自动关联在一起:
@Autowire
private List<SomeInterface> springComponentsImplList;
我可以用这种方式注入它们吗?:
@Autowire
private Map<String,SomeInterface> springComponentsImplList;
这样,我可以通过“键”获得实现?如果该键是类名或类似的东西并且是自动生成的,那将是完美的。
谢谢!
答案 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
}