推断构造方法分析
2022-10-14 09:16:45 0 举报
Spring实例化所采用的那个构造方法进行实例化,推断过程的分析
作者其他创作
大纲/内容
N
进行推断构造方法
实际上,在每遍历一个构造方法时,如果发现前面的遍历过程中已经选定了一个候选者,并且也找到了合适的构造方法参数值,并且当前的构造方法参数个数小于前面所选定的构造方法,则break循环
AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
对候选构造方法进行排序,public的方法排在最前面,都是public的情况下参数个数越多越靠前
是
继续遍历下一个候选者
计算得到的构造方法参数值和参数的匹配程度
满足其中一个找到构造方法并实例化
拿到上面筛选出来的构造方法和参数值
否
BeanDefinition制定了构造方法参数值
AbstractAutowireCapableBeanFactory#obtainFromSupplier
getBean()时制定了参数值
是否通过getBean()指定了构造方法参数值
判断没有通过getBean()指定构造方法参数值
ConstructorResolver#autowireConstructor
遍历结束
如果方法不是static的,那么解析出来的BeanDefinition中:factoryBeanName为AppConfig所对应的beanName,比如\"appConfig\"factoryMethodName为对应的方法名,比如\"aService\"factoryClass为AppConfig.class如果方法是static的,那么解析出来的BeanDefinition中:factoryBeanName为nullfactoryMethodName为对应的方法名,比如\"aService\"factoryClass也为AppConfig.class
mbd.resolvedConstructorOrFactoryMethod
如果指定了构造方法,则作为候选者
经过上述步骤,判断是否能直接使用构造方法和构造方法参数值
选择的构造方法的参数个数的最小值minNrOfArgs
果参数个数小于所要求的参数个数,则遍历下一个
是参数构造方法的注入
AbstractAutowireCapableBeanFactory#instantiateUsingFactoryMethod
autowire 为AUTOWIRE_CONSTRUCTOR
不满足直接调用无参实例化
基于构造方法参数先byType再byName,以及BeanDefinition种所设置的参数一起得到适合当前构造方法的参数值,封装为一个ArgumentsHolder对象
判断是否满足条件
Y两者确认,则使用该构造方法和参数实例化出一个对象
遍历所有构造方法
BeanDefinition中添加了Supplier
mbd.constructorArgumentsResolved
针对当前BeanDefinition是否缓存了构造方法和参数值
无无参实例化
如果没有指定构造方法,那就获取beanClass中的所有构造方法所谓候选者
如果参数个数匹配,则把所有参数值封装为一个ArgumentsHolder对象
true是否需要参数注入
1、只有一个候选构造方法(无参的)2、explicitArgs == null:并且没有通过getBean()方式传入参值3、!mbd.hasConstructorArgumentValues() : 且没有通过beanDefinition传值
在遍历过程中,会选择匹配程度值最小的构造方法
@Bean的处理
Y
AbstractAutowireCapableBeanFactory#autowireConstructor
有多个构造方法可以使用
如果两者任意一个为空,则执行下面逻辑
AbstractAutowireCapableBeanFactory#createBeanInstance#实例化
@Bean创建
调用Supplier来得到对象
构造方法是否缓存起来
确定要选择的构造方法的参数个数的最小值,后续判断候选构造方法的参数个数如果小于minNrOfArgs,则直接pass掉
0 条评论
下一页