乐趣区

关于java:Java面试Spring-中有两个-id-相同的-bean会报错吗如果会报错在哪个阶段报错

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 带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!

退出移动版