对构造方法进行注入
2023-05-30 21:20:24 2 举报
spring对于bean的构造方法推断源码的逻辑流程整理
作者其他创作
大纲/内容
为空
这个过程除了对构造方法参数进行注入之外,还需要对构造方法候选者进行进一步推断和筛选,最终选出唯一的构造方法进行注入方法入口org.springframework.beans.factory.support.ConstructorResolver#autowireConstructor
开始
不做操作
直接使用无参构造方法实例化并返回
3级
不为空
如果没有通过getBean传入构造参数,并且找到了构造方法以及要用的入参对象则缓存
如果再getBean的时候传入了入参,直接确定了入参
候选方法是否只有一个,并且没有指定要使用的方法参数值,并且构造方法是午餐的
判断当前是否有可用的构造方法,没有则抛出异常
循环对每个候选构造房方法进行筛选
对所有候选构造方法根据参数个数倒序排序
是
2级
end
4级
确定构造参数个数的最小值
父流程图
如果没有确定要使用的构造方法,或者确定了构造方法,但是没有确定所要传入的参数
候选构造方法集合是否为空
1级
获取到筛选出来的构造方法
得到入参,当然这个入参可能是null
1.通过bd来传入构造参数值的时候是允许指定参数值的下表的,也就说我可以只穿一个参数,但是我指定下标为1(下标起始为0),那么使用的构造参数至少需要两个参数2.在这里,spring进行了对于RuntimeBeanReference的处理,spring允许,使用RuntimeBeanRefrence对象作为参数传入,在进行构造推断的时候,spring会根据RuntimeBeanRefence保存的类型或beanName从BeanFactory中获取寻找合适的bean
确定入参
通过BeanDefinition传入参数值
去获取注入bean 的所有构造方法作为候选者
实例化对象
如果没有传入入参,则查看缓存,看之前是否已经注入过构造方法,如果注入过,直接用缓存中的入参和构造方法,当然这些入参不一定是直接可用的对象,需要经过解析以及类型转换,之后得到真正的入参
是否通过getBean传入参数
否
流程分层级也就是说上级负责大致意思下级负责详细说明蓝色为一级、绿色为二级
如果都确定了,那么自然可以直接实例化
5级
0 条评论
回复 删除
下一页