今天写一个有意思的东西,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值泛型的所有实现类