java @可以将接口自动连接为Map〈String,InterfaceName>吗?

r6l8ljro  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(109)

假设我有一个“SomeInterface”,我有两个实现这个“SomeInterface”的springComponentImpl。
我知道我可以同时自动连接两个实现,使用:

@Autowire
private List<SomeInterface> springComponentsImplList;

我可以这样注射吗?:

@Autowire
private Map<String,SomeInterface> springComponentsImplList;

这样我就可以通过一个“键”来得到实现了,如果这个键是类名或者其他什么东西,并且是自动生成的,那就太完美了。

nimxete2

nimxete21#

下面的代码应该是现成的,其中Map包含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);
}
bfrts1fy

bfrts1fy2#

您可以将Spring Bean注入到两个单独的List

**第一种方法:**如果您只有其中的每一个,则使用@Qualifier来命名它们
服务接口

public interface ServiceInterf {

}

实施一

@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;

**第二种方法:**如果有多个,则可以使用@Qualifier5.2. Using @Qualifier to Select Beans在config类中声明它们

@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 

}

相关问题