spring之推断构造方法

目录

源码流程(属于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 实例
spring之推断构造方法_第1张图片
2. 根据BeanDefinition加载类得到Class对象
3. 如果BeanDefinition绑定了一个Supplier,那就调用Supplier的get方法得到一个对象并直接返回

spring之推断构造方法_第2张图片

4. 如果BeanDefinition中存在factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回
5. 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象

如果在生成BeanDefiniton的时候已经设置好了构造方法,然后在这一步就回去自动构造对象

6. 如果BeanDefiniton没有定义自动构造方法,调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法得到哪些构造方法是可以用的

会先判断有没有@Lookup注解,如果有就生成一个代理对象返回

spring之推断构造方法_第3张图片

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创建对象”、“工厂方法创建对象”、“推断构造方法”一步一步判断能否生成对象。

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