上篇介绍了instantiateBean()(其实这个方法在后面还会再次被调用)
如果在前两篇的内容结束后都还未获取到构造函数,那么则继续向下执行,调用determineConstructorsFromBeanPostProcessors()方法

determineConstructorsFromBeanPostProcessors()是做什么的(b_d)?
构造器数组ctors会通过调用determineConstructorsFromBeanPostProcessors()方法获取全部的构造器,然后在后续的逻辑中进行筛选,是从bean后置处理器为自动装配寻找构造方法,有且仅有一个有参构造或者有且仅有@Autowired注解构造时构造方法才能被识别,需要根据参数解析构造函数。
进入该方法:

进入同名方法
选择一个熟悉的类,打开瞅瞅(我这里选了`AutowriedAnnotationBeanPostProcessor`当实例,当然也可以选别的来看)

方法中会先处理包含`@Lookup`注解的方法,如果集合中没有`beanName`,则走一遍`bean`中的所有方法,过滤是否含有`lookup`方法,不过无论是否含有`lookup`注解修饰的方法,过滤完成后都会放到集合中,证明此`bean`已经检查完`@Lookup`注解

随后会尝试从缓存中拿构造函数,不存在的话就进入代码块中再拿一遍,还不存在就获取`bean`中所有的构造函数,还不存在就……实在不行就`new`一个构造器,反正这步就是要拿到构造器=[,,_,,]:3

方法结束后,方法将返回构造器的集合:`Constructor<?>[] ctors`,随后选择合适的构造器,创建一个实例化好(已经在堆中开辟好空间)的`beanInstance`对象并将其包装成`BeanWrapper`对象进行属性填充,即执行完了`createBenaInstance()`方法的逻辑,值得注意的是,`createBenaInstance()`方法获取到的并不是`Bean`本身,而是一个`Bean`的包装类——`org.springframework.beans.BeanWrapper`那么,为什么要使用BeanWrapper类进行属性填充?
BeanWrapper的属性填充
首先,返回的beanInstance对象会被包装成BeanWrapper对象进行属性填充
灵魂拷问:为啥要搞一个包装类叻?
BeanWrapper会提供很多的对象工具类,可以直接使用这个包装类来完成对于属性的填充
在获取到包装类后,从包装类中获取原始的bean对象以及具体的bean对象的Class属性信息,紧接着判断其是否为空

我们下篇继续学习o(*▽*)q