spring源码分析笔记(2)推断构造方法

spring源码分析笔记(2)推断构造方法

个人理解,可能有错误

推断构造方法 :
调用后置处理器 determineConstructorsFromBeanPostProcessors 第一次推断构造方法,分几种情况:

手动注入:
1.如果没有提供构造方法-------推断构造为null,实例化对象默认使用无参构造
2.如果提供了默认的无参构造方法-------推断构造为null,实例化对象默认使用无参构造
3.如果提供了多个构造方法-------推断构造为null,实例化对象默认使用无参构造
4.如果提供了多个构造方法,其中一个加了@Autowried(required=true)------推断构造就返回这个构造,用这个构造方法实例化对象
5.如果提供了多个构造方法,加了多个@Autowried(required=true)------异常,报错
6.如果提供了多个构造方法,加了多个@Autowried(required=false)------推断返回多个,加了这个注解的和默认的构造方法都返回------然后进行再次推断autowireConstructor(beanName, mbd, ctors, args),
7.如果提供一个带参构造方法,同时不提供无参构造------推断返回这个构造方法
8.如果提供多个带参构造方法,同时不提供无参构造------推断返回null,准备使用默认构造实例化对象,此时无法获得默认无参构造,所以报错。

自动注入:
使用bean工厂后置处理器BeanFactoryPostProcessor 修改目标类的注入模型为自动注入AUTOWIRE_CONSTRUCTOR,就必然会进入再次推断方法中

1.第一次推断返回空------进入再次推断autowireConstructor,先获取所有构造,再进行后面的操作
2.第一次推断返回多个构造方法------将第一次返回的构造方法传给autowireConstructor(beanName, mbd, ctors, args),进入再次推断,获取ctors,在进行后面的操作

再次推断构造方法 autowireConstructor(beanName, mbd, ctors, args):
如果ctors为空,就重新获取所有构造;如果不为空,就使用ctors。
然后对构造方法进行排序,参数越多的构造越靠前,然后遍历取有效的那个,结果就是取到有效构造中参数最多的那个构造;参数数量相同的,参数是类的比是接口的优先;参数数量相同且是最多的,并且参数类型也是形同的,会把两个构造方法都放到模糊不清的构造方法set中,返回的是排序时在前面的那个。

推断完构造方法以后,都会放到缓存中【argsHolderToUse.storeCache(mbd, constructorToUse)】,不管是单例的还是原型的

你可能感兴趣的:(java,spring)