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

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值