前言:今天在群里看有人在讨论@Autowired相关的知识,有很多人说按照类型装配依赖对象,有说按name装配依赖的对象,有的说先按类型再按照name去装配......这些问题虽然很基础,但是确实也有很多人不清楚,很多人也是只是记住了装配的对象,这种也就糊弄下低级面试官而已,今天我们就从spring源码的角度来看这个面试官喜欢问的@Autowired这个装配顺序。
1.先来一个入门小demo(前提是要有spring-context的依赖),几个基础的类,我就不详细介绍了,自己看截图
2.直接启动main方法
结果:毫无疑问,这个时候肯定会报错,会报错,大致的错误应该就是,希望找到一个bean但是找到两个。。。。
如果把testService里面注入的名字改一下就不会报错了
从这个简单的demo,你能够确定@Autowired是按照什么装配的吗?讲道理我觉得不能。我也不去做这个假设了,没有必要,直接看源码才最有说服力。这边我要提一下:spring的装配模式有多种,byName,byType,construct,no源码用0,1,2,等表示,
但是装配技术仅仅有byName和byType,这点以后总结spring源码的时候会详细说的。
源码分析:(这次我只是直接分析这一次装配的源码,spring的属性填充,后置处理器啥的我都不讲,这些都是在我别的专题有讲过的),大致调用链就是(先调用createBaen-->doCreateBean-->populateBean属性填充-->调用后置处理器来填充属性,Autowired的后置处理器是AutowiredAnnotationBeanPostProcessor)