spring特殊注入(List,Map)
2020-06-19 本文已影响0人
yiqiquhuxi
今天写一个有意思的东西,spring的特殊注入(List,Map)
之前在整理观察者模式和中介者模式的时候,都需要有一个集合容器来放入我们的被执行的对象(前文请参考:观察者,中介者)
有时候不同逻辑需要的集合里面元素不一样,有时候会引出线程安全问题(可以用多例来保证线程安全)。
看看今天需要学习的内容,首先定义一个接口和三个实现类:
一个接口和三个实现类需要把这几个实现类放入集合中,方便我们调用
通常做法:
@Resource(name = "aDemoService")
private DemoService aDemoService;
@Resource(name = "bDemoService")
private DemoService bDemoService;
@Resource(name = "cDemoService")
private DemoService cDemoService;
@Test
void test(){
List<DemoService> demoServices = new ArrayList<DemoService>();
demoServices.add(aDemoService);
demoServices.add(bDemoService);
demoServices.add(cDemoService);
demoServices.stream()
.forEach((a) -> {
System.out.println(a);
});
}
输出结果:
com.example.specialinjection.service.ADemoService@5f404594
com.example.specialinjection.service.BDemoService@53692008
com.example.specialinjection.service.CDemoService@7b2a3ff8
今天有个更加简单的注入方式,直接注入容器类(List,Map),来满足我们的需求
no bi bi,show code:
@Autowired
private List<DemoService> demoServiceList;
@Autowired
private Map<String, DemoService> demoServiceMap;
@Test
void contextLoads() {
demoServiceList.stream()
.forEach((a) -> {
System.out.println(a);
});
System.out.println("_______________________________________________");
demoServiceMap.entrySet().stream()
.forEach((a) -> {
System.out.println(a.getKey());
System.out.println(a.getValue());
});
}
结果:
com.example.specialinjection.service.ADemoService@5b3bb1f7
com.example.specialinjection.service.BDemoService@58d6b7b9
com.example.specialinjection.service.CDemoService@3f1a4795
_______________________________________________
aDemoService
com.example.specialinjection.service.ADemoService@5b3bb1f7
bDemoService
com.example.specialinjection.service.BDemoService@58d6b7b9
cDemoService
com.example.specialinjection.service.CDemoService@3f1a4795
是不是很简单
-如果注入list集合,则元素是该list泛型的所有实现类(这里的list元素顺序,我们可以在springbean上加上@Order控制顺序)
-如果注入map集合,则元素key为springbean的名称,值为该map值泛型的所有实现类