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

XML 配置文件

在同一个 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 初始化之后的依赖注入阶段发生的。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值