Spring会注入@Configuration类提供的Bean吗?属于哪种依赖注入?
Spring依赖注入问题解答
注入是否成功
DataService的构造器可以正常完成依赖注入。顺带提一句你贴的配置类代码有个笔误:readings.put("1", new Data())这里变量名写错了,应该是dataMap.put("1", new Data()),修正后代码可以正常运行。
你给出的配置类代码如下:
@Bean public Map<String, List<Data>> data() { final Map<String, List<Data>> dataMap = new HashMap<>(); // 原代码笔误:readings应为dataMap dataMap.put("1", new Data()); return dataMap; }
对应的DataService类代码如下:
@Service public class DataService { private final Map<String, List<Data>> information; public DataService(Map<String, List<Data>> information) { this.information = information; } }
所属注入类型
这属于构造器自动注入,是Spring 4.3版本之后新增的默认规则:被Spring管理的类(比如加了@Service的类)如果只声明了一个有参构造方法,不需要额外在构造方法上加@Autowired注解,Spring会自动对这个构造方法的参数执行依赖注入。
匹配规则说明
这个场景确实是按类型(by type)注入,和参数名、Bean名称是否一致完全无关:
- 你通过
@Bean注解声明的Bean,本身类型就是Map<String, List<Data>>,和构造器入参的类型完全匹配,Spring会直接找到这个类型对应的Bean完成注入,不会关心构造器参数叫information还是其他名字,也不关心@Bean对应的方法名是data还是其他值。 - 这里要注意和Spring内置的集合特殊注入规则区分:如果你没有显式定义
Map<String, List<Data>>类型的Bean,当注入目标是Map<String, X>格式时,Spring会默认把容器中所有X类型的Bean收集起来,以Bean名为key、Bean实例为value组装成Map注入。但你这里已经显式定义了类型完全匹配的Map Bean,显式定义的Bean优先级更高,不会触发上述的自动组装集合逻辑。
内容的提问来源于stack exchange,提问作者user3310115
相关产品推荐
相关产品推荐

