Spring推断构造方法底层执行流程
2022-05-17 17:28:07 1 举报
Spring推断构造方法底层执行流程如下:当Spring容器创建Bean实例时,首先会检查该类是否有无参构造函数。如果有,则直接调用无参构造函数创建对象;如果没有,则根据传入的参数个数和类型,查找匹配的构造函数,如果找到多个匹配的构造函数,则抛出异常;如果只找到一个匹配的构造函数,则调用该构造函数创建对象;如果一个都没有找到,则同样抛出异常。在创建对象的过程中,Spring还会为Bean的属性进行赋值,包括通过注解注入、XML注入等方式。最后,将创建好的Bean实例返回给调用方。
作者其他创作
大纲/内容
Y
如果当前候选者的参数个数小于minNrOfArgs,则该候选者不匹配,继续下一个候选者
BeanDefinition中指定了构造方法参数值
开始遍历候选者
计算得到的构造方法参数值和参数的匹配程度
如果参数个数匹配,则把所有参数值封装为一个ArgumentsHolder对象
缓存上面所推断出来的构造方法
经过上述步骤,判断是否直接确定了构造方法和构造方法参数值
根据推断出来的构造方法进行实例化
如果传入了构造方法,则直接把这些构造方法作为候选者
是否通过getBean()方法指定了构造方法参数值
缓存该构造方法和构造方法参数值(new Object[0])
实际上,在每遍历一个构造方法时,如果发现前面的遍历过程中已经选定了一个候选者,并且也找到了合适的构造方法参数值,并且当前的构造方法参数个数小于前面所选定的构造方法,则break循环
判断有没有通过getBean()方法指定构造方法参数值
N
对候选者进行排序,按构造方法的参数个数降序排序,参数个数多的在前
有多个构造方法都可以使用
计算构造方法参数个数最少个数,minNrOfArgs
针对当前BeanDefinition是否缓存了构造方法和构造方法参数值
autowire为AUTOWIRE_CONSTRUCTOR
基于构造方法参数先byType再byName,以及BeanDefinition中所设置的参数一起得到适合当前构造方法的参数值,封装为一个ArgumentsHolder对象
进行推断构造方法
意思是,现在程序员手动指定了几个构造方法参数值,所以当前BeanDefinition对应的beanClass中所有的构造方法的参数个数至少满足程序员手动指定的参数值个数
继续遍历下一个候选者
该构造方法是不是无参的构造方法
getBean()时指定了构造方法参数
在遍历过程中,会选择匹配程度值最小的构造方法
遍历结束
如果这两者任意一个为空,则继续继续进行下面的步骤
如果两者都确定了,那么则直接使用该构造方法和参数进行实例化得到一个对象
如果没有传入构造方法,那么则获取当前BeanDefinition对应的beanClass中的所有构造方法作为候选者
判断候选者构造方法是不是只有一个,并且没有指定构造方法参数
0 条评论
下一页