目录
源码流程(属于Bean生命周期中的实例化阶段)
1. AbstractAutowireCapableBeanFactory类中的createBeanInstance()方法去创建Bean 实例
2. 根据BeanDefinition加载类得到Class对象
3. 如果BeanDefinition绑定了一个Supplier,那就调用Supplier的get方法得到一个对象并直接返回
4. 如果BeanDefinition中存在factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回
5. 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象
6. 如果BeanDefiniton没有定义自动构造方法,调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法得到哪些构造方法是可以用的
7. 如果存在可用得构造方法,或者当前BeanDefinition的autowired是 AUTOWIRE_CONSTRUCTOR,或者BeanDefinition中指定了构造方法参数值,或者创建Bean 的时候指定了构造方法参数值,那么就调用autowireConstructor()方法自动构造一个对象
8. 最后,如果不是上述情况,就根据无参的构造方法实例化一个对象
总结
源码流程(属于Bean生命周期中的实例化阶段)
1. AbstractAutowireCapableBeanFactory类中的createBeanInstance()方法去创建Bean 实例
2. 根据BeanDefinition加载类得到Class对象
3. 如果BeanDefinition绑定了一个Supplier,那就调用Supplier的get方法得到一个对象并直接返回
4. 如果BeanDefinition中存在factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回
5. 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象
如果在生成BeanDefiniton的时候已经设置好了构造方法,然后在这一步就回去自动构造对象
6. 如果BeanDefiniton没有定义自动构造方法,调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法得到哪些构造方法是可以用的
会先判断有没有@Lookup注解,如果有就生成一个代理对象返回
7. 如果存在可用得构造方法,或者当前BeanDefinition的autowired是 AUTOWIRE_CONSTRUCTOR,或者BeanDefinition中指定了构造方法参数值,或者创建Bean 的时候指定了构造方法参数值,那么就调用autowireConstructor()方法自动构造一个对象
autowireConstructor()执行流程:
1. 先检查是否指定了具体的构造方法和构造方法参数值,或者在BeanDefinition中缓存了具体的构造方法或构造方法参数值,如果存在那么则直接使用该构造方法进行实例化
2. 如果没有确定的构造方法或构造方法参数值,那么
2.1 如果没有确定的构造方法,那么则找出类中所有的构造方法
2.2 如果只有一个无参的构造方法,那么直接使用无参的构造方法进行实例化
2.3 如果有多个可用的构造方法或者当前Bean需要自动通过构造方法注入
2.4 根据所指定的构造方法参数值,确定所需要的最少的构造方法参数值的个数
2.5 对所有的构造方法进行排序,参数个数多的在前面
2.6 遍历每个构造方法
2.7 如果不是调用getBean方法时所指定的构造方法参数值,那么则根据构造方法参数类型找值
2.8 如果时调用getBean方法时所指定的构造方法参数值,就直接利用这些值
2.9 如果根据当前构造方法找到了对应的构造方法参数值,那么这个构造方法就是可用的,但是 不一定这个构造方法就是最佳的,所以这里会涉及到是否有多个构造方法匹配了同样的值, 这个时候就会用值和构造方法类型进行匹配程度的打分,找到一个最匹配的
8. 最后,如果不是上述情况,就根据无参的构造方法实例化一个对象
总结
推断构造方法,主要流程为在Bean的生命周期中的实例化阶段,在该阶段会先判断“supplier创建对象”、“工厂方法创建对象”、“推断构造方法”一步一步判断能否生成对象。