Spring 中,有两个id相同的bean,会报错吗,如果会报错,在哪个阶段报错?

Hi,大家好,我是 浮生
一个工作 3 年的粉丝,早上 6 点给我微信发语音,把我直接吓醒。
我以为什么天大的事情,结果一问才知道。
面试官问了他一个问题没答上来,
问题是“Spring 里面,如果两个 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,在 Spring IOC 容器中只会注册第一个声明的 Bean 的实例。 后续重复名字的 Bean 就不会再注册了。
像这样一段代码,在 Spring IOC 容器里面,只会保存 UserService01 这个实例,后续 相同名字的实例不会再加载。
(如图)如果使用@Autowired 注解根据类型实现依赖注入,因为 IOC 容器只有 UserService01 的实例,所以启动的时候会提示找不到 UserService02 这个实例。
如果使用@Resource 注解根据名词实现依赖注入,在 IOC 容器里面得到的实例对象是 UserService01,
于是 Spring 把 UserService01 这个实例赋值给 UserService02,就会提示类型不匹配 错误。
这个错误,是在 Spring IOC 容器里面的 Bean 初始化之后的依赖注入阶段发生的。
以上就是我对这个问题的理解。
面试总结
你看,一个小小的面试题,竟然涉及到这么多知识点。
有些粉丝会问,这个我已经会用了,问这个问题的意义在哪里?
其实很多刚工作 1~2 年的小伙伴,如果出现使用不当很容易出现各种异常。
而对 Spring 有足够深入的理解,可以快速解决各种异常。
我是 浮生,一个工作 14 年的 Java 程序员,咱们下期再见!

最新很多同学问我有没有java学习资料

我根据我从小白到架构师多年的工作经验整理出来了一份50W字面试解析文档、简历模板、java学习路线图、java必看学习书籍、需要的小伙伴
可以关注公众号:“灰灰聊架构”,回复暗号:“321”获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值