Hi,大家好,我是 Mic
一个工作 3 年的粉丝,早上 6 点给我微信发语音,把我间接吓醒。
我以为什么天大的事件,后果一问才晓得。
面试官问了他一个问题没答上来,问题是“Spring 外面,如果两个 id 雷同的 bean 会报错吗?如果会,在哪个阶段报错?”
上面看看普通人和高手的答复!
普通人:
两个 id 雷同的 bean 应该会报错因为在 Spring IOC 容器外面,它的 id 肯定是惟一的吧。如果说有两个雷同的 id 的话那就会存在找不到,就是说咱们去找一个 bean 的时候,他会依据名字来找,要么依据类型。
在哪个阶段的话。。。应该是在 spring 启动的时候吧。
高手:
好的,对于这个问题,我从几个点来答复。
首先,在同一个 XML 配置文件外面,不能存在 id 雷同的两个 bean,否则 spring 容器启动的时候会报错。
因为 id 这个属性示意一个 Bean 的惟一标记符号,所以 Spring 在启动的时候会去验证 id 的唯一性,一旦发现反复就会报错,
这个谬误产生 Spring 对 XML 文件进行解析转化为 BeanDefinition 的阶段。
然而在两个不同的 Spring 配置文件外面,能够存在 id 雷同的两个 bean。IOC 容器在加载 Bean 的时候,默认会多个雷同 id 的 bean 进行笼罩。
在 Spring3.x 版本当前,这个问题产生了变动
咱们晓得 Spring3.x 外面提供 @Configuration 注解去申明一个配置类,而后应用 @Bean 注解实现 Bean 的申明,这种形式齐全取代了 XMl。
在这种状况下,如果咱们在同一个配置类外面申明多个雷同名字的 bean,在 Spring IOC 容器中只会注册第一个申明的 Bean 的实例。
后续反复名字的 Bean 就不会再注册了。
像这样一段代码,在 Spring IOC 容器外面,只会保留 UserService01 这个实例,后续雷同名字的实例不会再加载。
如果应用 @Autowired 注解依据类型实现依赖注入,因为 IOC 容器只有 UserService01 的实例,所以启动的时候会提醒找不到 UserService02 这个实例。
如果应用 @Resource 注解依据名词实现依赖注入,在 IOC 容器外面失去的实例对象是 UserService01,
于是 Spring 把 UserService01 这个实例赋值给 UserService02,就会提醒类型不匹配谬误。
这个谬误,是在 Spring IOC 容器外面的 Bean 初始化之后的依赖注入阶段产生的。
以上就是我对这个问题的了解。
总结
你看,一个小小的面试题,居然波及到这么多知识点。
有些粉丝会问,这个我曾经会用了,问这个问题的意义在哪里?
其实很多刚工作 1~2 年的小伙伴,如果呈现使用不当很容易呈现各种异样。
而对 Spring 有足够深刻的了解,能够疾速解决各种异样。
喜爱我的作品的小伙伴记得点赞和珍藏加关注。
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!