推断构造方法
2023-08-02 21:57:19 0 举报
推断构造方法
作者其他创作
大纲/内容
从缓存中获取构造方法和构造方法参数值
无参数直接实例化
resolveAutowiredArgument
只要加了@Autowire就会加入到该集合中
autowireConstructor
判断只允许一个@Autowire(require = true)存在其他的Autowire都不行可以全部为false
AbstractAutowireCapableBeanFactory.doCreateBean()
defaultConstructor = candidate
得到bean的class,并验证class的访问权限是不是public
evaluateBeanDefinitionString
实例化bean
determineConstructorsFromBeanPostProcessors
如果参数对象是一些特殊的类型,则需要进行额外的解析,比如RuntimeBeanReference、RuntimeBeanNameReference等等
beanClass.getDeclaredConstructors()
resolveBeanClass
其中一个成立
如果有多个可用的构造方法或者当前Bean需要自动通过构造方法注入根据所指定的构造方法参数值,确定所需要的最少的构造方法参数值的个数
判断是否有LookUp注解
之前获取到了参数【是从BeanDefinition指定的】要解析配置的参数String,boolean等
没有缓存直接会去找SmartInstantiationAwareBeanPostProcessor逻辑会把加了@Autowire注解的bean找出来
遍历所有构造方法判断是否加了@Autowire
拿到所有的构造方法
如果指定的构造函数,获取所有的beanClass
candidates.add(candidate)
进行排序AutowireUtils.sortConstructors()排序规则:首先public在前面,参数个数多的在前面
createBeanInstance()
匹配最佳的构造方法,如果参数个数相同,分数越小越匹配,值相等需要查看模式是否为宽松模式(默认为宽松模式,可以改成非宽松模式,宽松模式和非宽松模式的计算方法也不一样)
直接去匹配无参构造函数instantiateBean
创建缓存然后判断是否可以根据缓存去创建对象
resolveValueIfNecessary
拿出所有的构造函数进行判断
mbd.getInstanceSupplier()
如果存在一个require=true,直接把true加入candidateConstructors,如果不存在等于true的但是默认的无参构造函数不为空就加入到candidateConstructors
都不成立
只有一个构造函数,并且没指定参数,同时该构造方法是无参的,就直接使用无参的
判断是否可以直接根据缓存去创建对象如果可以直接不需要走面的流程,这种方式针对单例bean并无太大作业,主要针对懒加载的和原型bean
findAutowiredAnnotation()
instantiateWithMethodInjection() 执行该方法
determineRequiredStatus记录唯一个require = true的requiredConstructor = candidate
如果参数对象是autowiredArgumentMarker,表示这个参数对象没有意义,需要进行解析从BeanFactory中找到bean对象作为真正的参数对象
如果参数对象是一个字符串,则进行Spring EL表达式解析,结果可能是字符串或bean对象了
有参数
直接加入到candidateConstructors中
1. 拿出来的candidateConstructor不为空2. autowiremode模式为AUTOWIRE_CONSTRUCTOR3. BeanDefinition指定了构造方法参数值4. 调用getBean的时候传入了构造方法参数值
不进行推断方法,直接返回实例
autowireConstructor()
instantiateUsingFactoryMethod()
直接去调用
candidates不为空
原型BeanDefinition,会多次来创建Bean,那么就可以把该BeanDefinition所要使用的构造方法缓存起来,避免每次都进行构造方法推断
newInstance
resolvePreparedArguments
参数个数为0则记录唯一一个无参的构造方法
getBean()传入了args就是使用传入的
instantiateBean
rawCandidates只存在一个构造方法并且是有参的
如果有多个有参、并且没有添加@Autowired的构造方法,返回空
遍历所有构造函数,判断参数个数,判断是否使用@ConstructorProperties注解,使用直接拿上面的参数
0 条评论
回复 删除
下一页