今天写一个有意思的东西,spring的特殊注入(List,Map)

之前在整理观察者模式和中介者模式的时候,都需要有一个集合容器来放入我们的被执行的对象(前文请参考:观察者,中介者
有时候不同逻辑需要的集合里面元素不一样,有时候会引出线程安全问题(可以用多例来保证线程安全)。

看看今天需要学习的内容,首先定义一个接口和三个实现类:

一个接口和三个实现类

需要把这几个实现类放入集合中,方便我们调用

通常做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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);
});
}

输出结果:

1
2
3
4
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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());
});
}

结果:

1
2
3
4
5
6
7
8
9
10
11
12
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值泛型的所有实现类