1

我有一个基于 maven 构建工具的 Spring MVC 项目。在我的应用程序中,我必须对外部服务器进行 Web 服务调用以获取某些数据。我已经实现了它,一切都很好。

但在开发模式下,我宁愿避开它们。所以目前我有

public static boolean devel = false

我使用上面的布尔与if else语句,以便如果在开发模式下,则提供静态数据。如果不是开发模式,则进行 Web 服务调用。

但我发现这个布尔声明很脏。从某种意义上说,每次在生产中部署它时,我都必须手动更正代码中的布尔值。一旦我忘记了那会造成严重破坏。

有什么好办法吗?我不想在代码中声明这个变量,而是从构建过程中获得的一些常量或者可能是一些 VM 参数。或者他们甚至可能是更好的方法。如果是这样,我如何将它合并到我的 spring-maven 项目中。

4

3 回答 3

3

我要做的是让代码默认为生产行为,比如让 bool devel 来自属性文件。类路径中的默认值 = false 并且为了覆盖它我会使用类似的东西:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:config.properties</value>
            <value>${external-config}</value>
        </list>
    </property>
</bean>

在我的开发机器上,我运行我的应用程序

-Dexternal-config=file:/c:/debug.properties

该属性文件包含一些占位符,该占位符覆盖存储在 jar/war 中的 config.properties 中的值

于 2013-09-16T09:18:12.633 回答
1

Spring (3.1+) 提供了一种指定@Profile 的方法,可以与@Configuration 注解结合使用。看看http://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/

使用该方法,您可以为每个环境(生产、开发、登台等)创建自己的配置 bean

于 2013-09-16T11:22:58.640 回答
1

我认为“体面的方式”(正如你所说的那样)是使用依赖注入;使用Spring或 Java CDI功能。这正是依赖注入有用的场景类型。

然后,您将声明一个接口,该接口由两个不同的类实现:

  1. 真正的类 - 连接到远程服务器,和
  2. 返回静态数据的开发/测试类。

然后,您的启动配置将确定将两个类中的哪一个注入到您的应用程序中。

于 2013-09-16T09:27:02.397 回答