2011-06-08 88 views

回答

22

不要爲你的代碼添加邏輯來測試你正在運行的環境 - 這是一個災難的食譜(或者至少在路上燒掉很多午夜油)。

你使用Spring,所以要利用它。使用依賴注入爲您的代碼提供特定於環境的參數。例如。如果你需要調用在測試和生產不同的端點Web服務,做這樣的事情:

public class ServiceFacade { 
    private String endpoint; 

    public void setEndpoint(String endpoint) { 
     this.endpoint = endpoint; 
    } 

    public void doStuffWithWebService() { 
     // use the value of endpoint to construct client 
    } 
} 

接下來,使用Spring的PropertyPlaceholderConfigurer(或可替代PropertyOverrideConfigurer)來,無論是從屬性文件填充這個屬性,或者從JVM系統屬性,像這樣:

<bean id="serviceFacade" class="ServiceFacade"> 
    <property name="endpoint" value="${env.endpoint}"/> 
</bean> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:environment.properties</value> 
    </property> 
</bean> 

現在創建兩個(或三個或四個)文件,像這樣 - 每個不同的環境。

在environment-dev.properties:

env.endpoint=http://dev-server:8080/ 

在environment-test.properties:

env.endpoint=http://test-server:8080/ 

現在採取相應的屬性文件爲每個環境,重命名它只是environment.properties,並將其複製到應用程序服務器的lib目錄或其他應用程序的類路徑中的其他位置。例如。爲Tomcat:

cp environment-dev.properties $CATALINA_HOME/lib/environment.properties 

現在部署應用程序 - Spring將替代價值的 「http:// dev的服務器:8080 /」 時,它建立在運行時你的endpoint屬性。

有關如何加載屬性值的更多詳細信息,請參閱Spring文檔。

+0

感謝您的快速響應。你使用的例子是我正在使用的例子。我正在做的是創建一個類,其構造函數具有參數endpoint和客戶端代理。在appcontext.xml中,根據環境傳遞端點,使用映射,如 Ritesh 2011-06-08 20:41:23

+0

我的方法正確嗎? – Ritesh 2011-06-08 20:42:18

+0

不完全;請參閱最新的回覆。 – Pavel 2011-06-08 20:52:23

0

我們在我們的應用程序中這樣做,但不在spring配置中。

在應用程序啓動期間(在上下文偵聽器中),我們讀取計算機的主機名並將匹配的產品,開發,qa信息存儲在靜態變量中。

我們不直接訪問變量(儘管可以),但我們有一個彈簧服務,該變量與該變量連接,以便訪問我們的服務器環境信息。

0

一種方法是查看System.getProperty(key)方法,它是純java。然而,這可能不是一個好主意,因爲你不應該在你的應用程序中做這種環境邏輯。

另一種方法是服務器配置(爲每個環境的服務器配置不同的應用程序上下文文件)。

Spring 3.1還引入了新的方法,用可互換的屬性文件「正確地」做這種事情。你應該看看unified property management blogm1 release announcement有更多的細節。

相關問題