SpringFrameworkspringboot

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值泛型的所有实现类

上一篇下一篇

猜你喜欢

热点阅读