第一種情況:使用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,這個時候,就會提示類型不匹配的錯誤。