2015-12-28 40 views
0

我們有一個基於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定義:rep​​lace [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]

+1

http://stackoverflow.com/questions/10993181/defining-the-same-spring-bean-twice-with-same-name – OPK

+0

謝謝,這幫助我們雙倍確認,由於某種原因,Spring重寫A在某些服務器上用於B,而在另一些服務器中用於B。 – Perimosh

+0

@Kayaman沒有任何理由關閉了這個問題,因爲他提供的鏈接不能回答我的問題。我會編輯我的問題,所以請Kayaman在再次結束之前嘗試理解問題。 我知道Spring重寫同名的bean。問題在於它沒有確定的行爲。同樣的戰爭文件,部署在4臺不同的服務器,在前兩臺服務器中,重寫A的B,最後的兩個,B的A。任何問題?請告訴我。 – Perimosh

回答

1

我可以想像許多原因:

  • 類路徑掃描以未指定的順序返回配置-註解的類,
  • 配置類存儲在其中沒有指定的順序一個HashMap,
  • Class.getMethods()返回的方法以未指定的順序返回,
  • 等等等

你應該問自己:爲什麼要使用一個呢?你有沒有在任何地方指定訂單? Spring是否在這方面提供任何保證?如果沒有,你不應該假設任何事情。

相關問題