【Java访谈】在Spring中,如果有两个id相同的bean,会报错吗?如果有,会在什么阶段报错?微信语音把我吵醒了。本以为是大事,问了才知道。面试官问了他一个问题,他没有回答。问题是“在Spring中,如果两个id相同的bean会报错?如果报错,会在哪个阶段报错?”来看看普通人和专家的回答吧!普通人:两个id相同的bean应该会报错,因为在SpringIOC容器中,它的id必须是唯一的。如果有两个相同的id,是找不到的,也就是说我们找bean的时候,他会根据名字找,或者根据类型找。在什么阶段。..应该是春天开始的时候。师父:那我从几个方面来回答这个问题。首先,在同一个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,那么只有第一个声明的bean的实例会被注册到SpringIOC容器中。后续重复名称的bean将不会被再次注册。像这样一段代码,SpringIOC容器中只会保存UserService01实例,后续的同名实例不会再次加载。如果使用@Autowired注解根据类型实现依赖注入,由于IOC容器只有一个UserService01的实例,启动时会提示找不到UserService02的实例。如果使用@Resource注解实现基于名词的依赖注入,在IOC容器中获取到的实例对象为UserService01,那么Spring将UserService01的实例赋值给UserService02,会提示类型不匹配错误。这个错误发生在SpringIOC容器中Bean初始化之后的依赖注入阶段。以上是我对这个问题的理解。综上所述,大家可以看到一道小小的面试题,居然涉及到那么多的知识点。有粉丝会问,我已经知道怎么用了,问这个问题有什么意义?其实很多刚工作1~2年的朋友,如果使用不当,很容易出现各种异常。并且对Spring有足够深入的了解,可以快速解决各种异常。喜欢我作品的朋友记得点赞收藏关注。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
