spring之推断构造方法

发布时间:2024年01月08日

目录

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

文章来源:https://blog.csdn.net/m0_61853556/article/details/135362184
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。