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

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多 92 的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92 的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99% 做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务