spring-推断构造之春宵一刻

推断构造方法与注入模型有关,手动和自动
Spring推断构造方法原理:手动装配:
加@component注解 需要扫描进来
1.如果spring只有一个默认的无参构造时,这个时候spring就不会去推断,直接返回null,然后判断是null是直接利用反射调用默认的无参构造,
为什么要这样处理,这个是spring的精妙设计,这样可以不用进行推断,采用策略模式直接调用,
2.如果是多个构造方法是这个时候spring会去推断,这个时候spring的推断结果也是null,为什么是null,主要是构造方法上没有加@AutoWired,
这个时候spring认为是手动装配,同1结果,直接走默认的无参构造了,
3.如果只提供一个带参的构造方法是,spring会把这个带参的构造方法推断出来,为什么会推断处理,主要是因为spring没有选择了,本来spring想走无参构造,发现没有,
只有一个带参的,这个时候没有办法只能用这个带参的,spring就把他作为构造方法推断出来。
4.如果提供了两个合格的构造方法,就会抛异常,spring不知道用哪个了。
Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
手动装配ctors有两种情况,一个null,一个等于1,
Spring推断构造方法原理:自动装配:
不管你提供了多少构造方法我全部给拿出来,这个时候spring还要推断一次,就是要确定要使用那个构造方法,这个时候当我们推断出来的构造方法不等于null是,就会进入条件判断
AbstractAutowireCapableBeanFactory—> Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
(return ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args) ? this.instantiateBean(beanName, mbd) : this.autowireConstructor(beanName, mbd, ctors, args);
ctors 永远不能为多个,多个会报错)
自动动装配和手动装配一样ctors也有两种情况,一个null,一个等于1,因为他们用是统一逻辑,走的是一样的代码,这里spring写死了,

spring通过构造方法实例化beand的原理:
首先会实例化这个对象(通过构造方法实例化对象)—>{
有两种方式:手动装配和自动装配
手动装配:{
调用后置处理器:AbstractAutowireCapableBeanFactory—>determineCandidateConstructors
}第一次推断构造方法,分几种情况:同上,{
1.如果没有提供构造方法—>可以构造方法为null–没有提供,
2.如果提供了默认构造方法有且只有一个—为null ,为什么同上
3.如果是多个,–也为null,这个时候spring迷茫,不知道该用哪个,就为null,
4.如果是多个,且有一个加了@AutoWried=true 就返回这个加@AutoWried的这个构造
5.如果是多个,且有多个加了@AutoWried=true的,这个spring会异常,会报错,
6.如果是多个,且有多个加了@AutoWried=false的—>会返回多个构造方法—>会再次进行推断,这相当于手动装配,
7.如果提供一个带参的构造方法—为1,就会用他,同上解释。
}

自动装配:会加上@AutoWried
如果是多个,–也为null,这个时候spring迷茫,不知道该用哪个,自动装配这个时候会再次进行推断,找出最优的。spring能够实例化的最长,
spring怎么找出最优的,
1.有一个sort排序规则,public 参数最长的排在最前面,private 的在最后面。
2.更加精准的在前面。
3,差异权重。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值