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