一、现象介绍
Spring在项目启动初始化Map时,如果Map是显示的声明需要注入, 则, Spring会以Bean名称作为key,value中类型Bean实例作为value。 将所有Bean容器中符合类型的实例都put到该Map中,返回Map。 前提是:Map的key是String类型的
二、源码简析
源码方法位置在org.springframework.beans.factory.support.DefaultListableBeanFactory .doResolveDependency方法。
其中,在第1265行中,调用了resolveMultipleBeans方法:
进入这个方法一看就明白了:
如果你仔细看的话,无论是普通的单类型注入还是这种集合Map等的注入,都会涉及到一个方法, findAutowireCandidates,这个方法的作用就是查找匹配Spring容器中的所有同类型Bean实例。
三、实践测试一下
首先准备一个最简单的SpringBoot项目吧,只需要web依赖就行。 A和B两个接口实现类
在浏览器输入:http://localhost:8080/hello/AService A实现类调用
B实现类调用 Map中断点:
四、有什么用
策略模式
举一个简单的例子,我支付接口可以支持支付宝、微信、银联,是不是只要各自实现支付接口即可,然后根据选择的支付方式,调用不同的支付实现。后续要接入银行卡、信用卡是不是很容易扩展?
关于设计模式之策略模式的相关详细内容,我们放到下节再来展开讨论。
|