基于Spring的Web应用程序的特定于环境的配置?

时间:2011-06-08 20:19:14

标签: java spring deployment spring-mvc java-ee

我如何知道Web应用程序的部署环境,例如:无论是local,dev,qa还是prod等。有什么办法可以在运行时在spring应用程序上下文文件中确定这个吗?

4 个答案:

答案 0 :(得分:24)

不要在你的代码中添加逻辑来测试你正在运行的环境 - 这是一个灾难的处方(或者至少在路上燃烧了大量的午夜油)。

您使用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)从.properties文件或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-server:8080 /”。

有关如何加载属性值的更多详细信息,请参阅Spring文档。

答案 1 :(得分:10)

值得注意的是Spring 3.1 M1 introduced profiles support。这可能是满足这种需求的最终答案。所以要留意它。

与此同时,我个人完全正是帕维尔所描述的。

答案 2 :(得分:0)

我们在应用程序中执行此操作,但不在spring配置中执行此操作。

在app启动期间(在上下文侦听器中),我们读取机器的主机名并将匹配的prod,dev,qa info存储在静态变量中。

我们不直接访问变量(尽管可以)但我们有一个spring服务,它与该变量接口,以便我们访问我们的服务器环境信息。

答案 3 :(得分:0)

一种方法是查看System.getProperty(key)方法,它是纯java。但是,这可能不是一个好主意,因为你不应该在你的应用程序中真正做这种环境逻辑。

另一种方法是服务器配置(为每个环境的服务器配置不同的应用程序上下文文件)。

Spring 3.1也引入了新的方法来使用可互换的属性文件“正确”地完成这种事情。你应该看一下unified property management blogm1 release announcement中有更多详细信息。