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

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

1.装配技术:(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的,这只是有可能!(马上解释) -->

发布了41 篇原创文章 · 获赞 13 · 访问量 3103

猜你喜欢

转载自blog.csdn.net/qq_39965727/article/details/104639034
今日推荐