Spring中存在两个相同的Bean是否会报错?
第一种情况:使用XML的方式设置Bean,这种情况在Spring启动时就会报错,因为ID在Spring中是Bean的唯一标识,Spring容器在启动时会校验唯一性,一旦发现重复就会报错。但是如果是在两个不同的XML文件中定义两个相同的Bean,Spring容器会在启动时用第二个覆盖第一个,最终只有一个Bean,不会报错。
第二种情况:出现在Spring3.x之后,Spring支持以@Configration来声明一个配置类,然后用@Bean的形式声明一个Bean,这种形式完全替换了XML的格式,不会出现报错。那么当一个配置类中声明了多个相同的Bean时,IOC容器只会注册第一个Bean,后续重复的Bean都会忽略。
@Configuration
public class SpringConfiguration {
@Bean( name = "service" )
public Service1 service1( ){
return new Service1( );
}
@Bean( name = "service" )
public Service2 service2( ){
return new Service2( );
}
}
比如,像这样一段代码,在Spring IoC容器中,就只会保留service1这个实例。后续相同名字的Bean就不会再加载,当然也不会报错。
第三种情况,如果使用@Autowired注解来实现依赖注入的话,它是根据类型来注入的。比如像这样一段代码
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
因为IOC容器只有Service1的实例,所以启动的时候会提示找不到Service2这个实例。
第四种情况,再看这样一段代码:
@Resource( name="service" )
private Service1 service1;
@Resource( name="service" )
private Service2 service2;
如果使用@Resource注解根据名称来实现依赖注入的话,那么在IoC容器中只能获取到Service1的实例,
于是,Spring会把Service1这个实例赋值给Service2,这个时候,就会提示类型不匹配的错误。