外观
Spring 中有两个 id 相同的 bean 会报错
XML
配置方式:
同一配置文件:在同一个 XML
配置文件中不能存在 id
相同的两个 bean
,因为 id
是 Bean
的唯一标识,Spring
容器启动时会验证 id
的唯一性,若发现重复会在对 XML
文件进行解析转化为 BeanDefinition
的阶段报错,抛出 DuplicateBeanDefinitionException
异常。
不同配置文件:如果在两个不同的 XML
文件里配置了两个相同 id
的 bean
,IoC
容器在加载 Bean
时,会用后者覆盖前者,通常不会报错,但可能导致一些潜在问题,比如实际使用中可能加载到非预期的 Bean
实例。
注解配置方式:
使用 @Configuration
和 @Bean
注解:在同一个配置类里,使用 @Bean
注解声明多个相同名字的 Bean
,Spring IoC
容器只会注册第一个声明的 Bean
实例,后续重复名字的 Bean
不会再注册,也不会报错。
依赖注入阶段:若使用 @Autowired
注解根据类型实现依赖注入,当有两个相同 id
但不同类型的 Bean
,且只注册了其中一个类型的实例时,启动会提示找不到另一个类型的实例。若使用 @Resource
注解根据名称实现依赖注入,在 IoC
容器中只能获取到第一个注册的 Bean
实例,当将其赋值给与实际类型不匹配的变量时,会提示类型不匹配错误。