2011-06-08 87 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有更多的细节。

相关问题