从源码深入理解spring的 4 种装配模型 与 两种装配技术(byType, byName)以及注解 @Autowired

理解spring的 4 种装配模型 与 两种装配技术(byType, byName)

1.装配技术:(`byType, byName)

是指的怎样找到 目标bean所依赖的 属性候选bean是如何被找到的
其中
byType 技术:
通过给的候选类型的类class 对象 取bean工厂中 查询是否有此对应的 bd ,查询不到就会报错!,查询到 就会看此候选bean
(依赖的bean是否是已经生命周期过了,如果没有那就会先对此 候选bean 进行生命,如果已经存在了,那就直接返回候选bean其对应单例池中的对象 然后赋给 目标bean 的属性上 完成一套依赖注入流程!)

所以 构造器方式注入(不依赖@Autowired)其实也是 byType

byName 技术:
一个对象的,`

2.装配模型 : 指的是 怎样注入 一个 对象,那就有很多方式!具体是4种(No, byType, byName, xxxx)

3.接下来我们来谈谈 @Autowired 标注在属性字段上面后,对于此bean 来说,
到底是用的哪种模型 以及 何种装配技术呢。

首先网上对 @Autowired 的说法众说纷纭,又说是bytype自动装配,有说是先 byType,后再byName.
其实很少有人讲清楚!!–>其实是必须看了底层源码才明白到底如何,最后解析下源码!先把结论甩出来!
我觉得:

  1. 首先你必须看 @Autowired 它对于作用的bean 来说 他是用的哪种装配模型–> 答案:是 No 模型!!
    为啥说是No模型呢(大部分人可能都有混淆或不清楚),因为这是spring对于一个bd(即beandefiniton) 的默认属性即默认的装配模型是No。而如果跟源码我们可以看到至始至终 都没有地方改变过 一般自己定义的bean的 bd的装配模型,
    (如果采用注解的话是没有直接配置如xml可以指定bean直接为byType或其他的专配模型,一般必须借用spring提供的扩展点更改指定bean装配模型!我自己做过测试写过如使用 实现 ImportBeanDefinitionRegistrar 扩展点后 拿到指定bean对于的bd再设置其装配模型如:xxbd.setAutowireMode(1) --> 见另一篇 https://blog.csdn.net/qq_39965727/article/details/104379918

  2. 我们再确定好了 @Autowired 采用的自动装配的No 模型后,接下来就该思考那这个 默认的No模型到底是 如何 找到合适的属性bean 并注入到当前类里面的呢?先说答案吧:–> 的确是通过 byType 按属性的类型去找spring容器中的属性bean的(最终掉getBean()),注意了,这个过程可能发生几种情况的!

第1种:直接找到一个合适的 类型的属性bean了,那直接就feild.set(x,y) 欧克了。

第2种:找不到所匹配类型的bean, --> 这时候,spirng 不是报错,而是会根据 属性定义的 name 去spring中再次get找–> 如能找到就ok,否则异常。

第3种:找到多个类型相同的 bean 了,–>这也是很多人没讲到(必须看源码才知晓!),并不会直接和大多数人想的报错说找到两个bean的,这只是有可能!(马上解释) -->

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值