我們有一個基於Spring 4.0.5.RELEASE的應用程序,錯誤地,我們引入了兩個同名的bean。這兩種豆類的RestTemplate版本4.2.2的情況下,Spring框架進行HTTP調用:當Spring發現兩個同名的bean時,它做了什麼?
第一 「restTemplate」 豆
@Bean(name = "restTemplate")
protected RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new RestTemplateErrorHandler());
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
// Disable exceptions on unknown incoming properties
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jacksonConverter.setObjectMapper(mapper);
messageConverters.add(jacksonConverter);
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
二 「restTemplate」 豆,完全不經過
@Bean(name = "restTemplate")
protected RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
兩者之間的主要區別在於錯誤處理。這是問題:
我們有四個服務器正在運行,並且我們在每個服務器中都部署了相同的war文件。根據日誌,我們100%確定在前兩臺服務器中,正在使用帶錯誤處理的restTemplate實例。而在另外兩個,沒有錯誤處理的實例沒有被使用。
爲什麼Spring的行爲如此?它以完全不確定的方式注入「restTemplate」bean。這種行爲的原因可能是什麼?我希望在所有4臺服務器中都有相同的「restTemplate」實例。
在這裏我把日誌,顯示我想解釋什麼。看看大膽的聲明!
Sever的一個:
[時間戳= 19:09:23.846] [線索= 「本地主機 - startStop-1」] [會話= 「未定義」] [請求= 「未定義」] [級別= INFO] [logger = osbfsDefaultListableBeanFactory] [class = org.springframework.beans.factory.support.DefaultListableBeanFactory] [line = 839] - 使用不同的定義覆蓋Bean'restTemplate'的bean定義:replace [Root bean:class [null ]。範圍=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初級= FALSE; factoryBeanName = configCommon; factoryMethodName = restTemplate; initMethodName = NULL; destroyMethodName =(推斷);在[root bean:class [null];]中定義的[]在com.service.common.config.ConfigCommon]中定義。範圍=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初級= FALSE; factoryBeanName = configCentralReservations; factoryMethodName = restTemplate; initMethodName = NULL; destroyMethodName =(推斷); 在com.service.centralreservations.config.ConfigCentralReservations]
服務器兩個定義:
[時間戳= 19:04:41.717] [線索= 「本地主機 - startStop-1」] [會話=「未定義「] [request =」undefined「] [level = INFO] [logger = osbfsDefaultListableBeanFactory] [class = org.springframework.beans.factory.support.DefaultListableBeanFactory] [line = 839] - 重寫bean'restTemplate'使用不同的定義:替換[Root bean:class [null];範圍=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初級= FALSE; factoryBeanName = configCentralReservations; factoryMethodName = restTemplate; initMethodName = NULL; destroyMethodName =(推斷);使用[root bean:class [null];]來定義在[com.service.centralreservations.config.ConfigCentralReservations]中定義的[]。範圍=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初級= FALSE; factoryBeanName = configCommon; factoryMethodName = restTemplate; initMethodName = NULL; destroyMethodName =(推斷);在com.service.common.config中定義的。ConfigCommon]
http://stackoverflow.com/questions/10993181/defining-the-same-spring-bean-twice-with-same-name – OPK
謝謝,這幫助我們雙倍確認,由於某種原因,Spring重寫A在某些服務器上用於B,而在另一些服務器中用於B。 – Perimosh
@Kayaman沒有任何理由關閉了這個問題,因爲他提供的鏈接不能回答我的問題。我會編輯我的問題,所以請Kayaman在再次結束之前嘗試理解問題。 我知道Spring重寫同名的bean。問題在於它沒有確定的行爲。同樣的戰爭文件,部署在4臺不同的服務器,在前兩臺服務器中,重寫A的B,最後的兩個,B的A。任何問題?請告訴我。 – Perimosh