Spring中可以存在两个id相同的bean吗?会报错吗?

Hello大家好,我是小奕,一个工作了五年的阿里程序员,欢迎评论底下留言加粉丝群,我会拉你们加入粉丝群,觉得看的不错想了解更多这样的短文,也请大家多多关注这个我主页动态其他帖子。

依稀记得博主当年刚出来工作那会,当时技术比较菜,就没有回答上来,这个问题是, Sring里面如果存在两个ID相同的Bean会报错吗?如果会在哪报错儿呢? 

普通人的回答: 两个ID相同的Bean应该会报错吧,因为在spring lOC容器里面它的ID一定是唯一的吧,那如果说有两个相同ID的话,那就会存在我们去找一个bean的时候找不到,他会根据名字来找,或者根据类型来找,如果根据名字来找的话,他如果存在重复的话,我肯定只能找了一个,所以他应该是会在报错,然后在哪个阶段的话。应该是在spring启动的时候吧。

老司机的回答:关于这个问题呢,你们要从几个方面来回答。首先,在同一个XML配置文件里面不能存在ID相同的两个Bean,否则spring容器在启动的时候会报错。因为ID这个属性表示Bean里面的唯一标志符号,所以spring在启动的时候会去验证ID的一个唯一性,一旦发现重复就会报错。这个错误发生在spring对XML文件进行解析,转化为beanDefination的一个阶段。但是在两个不同的spring配置文件里面可以存在ID相同的两个Bean,IOC容器在加载bean的时候呢,默认会把多个相同ID的bean进行覆盖,在spring3.x版本以后呢?这个问题发生了变化。在spring3.x版本里面,提供了一个configuration这样一个注解,去声明一个配置类,然后使用bean这个注解去实现bean的声明,这种方式完全取代了XML的一个配置形式。那么在这种情况下,如果我们在同一个配置类里面去声明多个相同名字的bean。那么spring loc容器在解析的时候只会注册第一个声明bean的一个实例,后面重复名字的bean的实例就不会再注册了,像这样的代码在spring loc容器里面只会保存这样一个实例,后续相同名字的实例,不会再加载。如果使用autowire的这个注解去根据类型进行实例注入的时候,因为ioc容器,只存在一个之前那个注册好的实例子,所以在启动的时候会提示找不到这样一个实例,那我们使用resource这个注解去根据名字来实现依赖注入,而在spring IOC容器里面,根据名字只会得到一个已注册好的这个实例。于是spring把其他这样一个实例赋值给此实例的时候会提示一个类型不匹配的一个错误,那么这个错误呢,是在spring IOC容器里面的bean初始化之后依赖注入阶段去发生的。

一个小小的面试题,涉及到这么多的知识点,可能有人会问,这个我已经会用了。这个问题的意义在哪里呢?其实很多刚工作的小伙伴,如果出现使用不恰当,很容易出现各种奇怪的异常。而对于spring来说,如果你有足够深入的理解,那么你可以快速定位和解决这一类的异常。

#2022春招##面试##Java求助#
全部评论
学到了,不亏是阿里的啊
点赞 回复 分享
发布于 2022-06-29 20:15

相关推荐

今天 13:29
已编辑
湖南铁道职业技术学院 后端
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 6 评论
分享
牛客网
牛客企业服务