1. 前言
填充属性到bean原始对象,不就是用set方法把一些属性设置进去嘛
但是大佬说还有一些别的,比如
- 所有属性值都是以字符串的形式进行配置的,我们在将这些属性值赋值给对象的成员变量时,要根据变量类型进行相应的类型转换
- 对于一些集合类的配置,比如、和,还要将这些配置转换成相应的集合对象才能进行后续的操作
- 如果用户配置了自动注入(autowire = byName/byType),Spring 还要去为自动注入的属性寻找合适的注入项
我觉得也还好,来看看源码吧
这篇写的很寡,直接看总结吧
2. 源码分析
2.1 populateBean 源码一览
-
获取属性列表 pvs
-
在属性被填充到 bean 前,应用后置处理自定义属性填充
-
根据名称或类型解析相关依赖(autowire)
该逻辑只会解析依赖,并不会将解析出的依赖立即注入到 bean 对象中。所有的属性值是在 applyPropertyValues 方法中统一被注入到 bean 对象中的。
-
再次应用后置处理,用于动态修改属性列表 pvs 的内容
-
将属性应用到 bean 对象中
2.2 autowireByName
2.3 autowireByType
2.4 applyPropertyValues方法分析
通过上面的解析,最后通过此方法注入
上面来张图我没有截完整,因为作者也不是很明白,我也觉得好晦涩难懂,同时,我觉得也没啥研究必要,最后把大佬的总结粘过来
- 检测属性值列表是否已转换过的,若转换过,则直接填充属性,无需再次转换
- 遍历属性值列表 pvs,解析原始值 originalValue,得到解析值 resolvedValue
- 对解析后的属性值 resolvedValue 进行类型转换
- 将类型转换后的属性值设置到 PropertyValue 对象中,并将 PropertyValue 对象存入 deepCopy 集合中
- 将 deepCopy 中的属性信息注入到 bean 对象中
3. 总结
本文对 populateBean 方法及其所调用的 autowireByName、autowireByType 和 applyPropertyValues 做了较为详细的分析
我写完,大脑对细节还是一片空白,只是知道注入参数的大概方式
面试题 bean是怎么填充属性的
- name解析
- type解析
- 最后通过 applyPropertyValues 真正注入
附录