理解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.
其实很少有人讲清楚!!–>其实是必须看了底层源码才明白到底如何,最后解析下源码!先把结论甩出来!
我觉得:
-
首先你必须看 @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) -
我们再确定好了 @Autowired 采用的自动装配的No 模型后,接下来就该思考那这个 默认的No模型到底是 如何 找到合适的属性bean 并注入到当前类里面的呢?先说答案吧:–> 的确是通过 byType 按属性的类型去找spring容器中的属性bean的(最终掉getBean()),注意了,这个过程可能发生几种情况的!
第1种:直接找到一个合适的 类型的属性bean了,那直接就feild.set(x,y) 欧克了。
第2种:找不到所匹配类型的bean, --> 这时候,spirng 不是报错,而是会根据 属性定义的 name 去spring中再次get找–> 如能找到就ok,否则异常。
第3种:找到多个类型相同的 bean 了,–>这也是很多人没讲到(必须看源码才知晓!),并不会直接和大多数人想的报错说找到两个bean的,这只是有可能!(马上解释) -->