【Java面试】Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错()

  本篇文章为你整理了【Java面试】Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错()的详细内容,包含有 【Java面试】Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错,希望能帮助你了解 【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带你学架构!
 

  如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

  以上就是【Java面试】Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错()的详细内容,想要了解更多 【Java面试】Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: