Spring:根据配置文件注入不同的属性文件

时间:2012-02-24 17:28:41

标签: java spring google-app-engine

首先,一些背景:

我目前正在开展一个项目,在该项目中,我使用Google的AppEngine(GAE)上的Spring框架从Google的一项服务中获取一些数据。为此,我使用了Google的OAuth工具。为此,我需要使用特定于我的应用程序的clientSecretclientId。由于这些是静态配置值,我使用Spring的<util:properties>link to documentation)功能将这些值插入到适当的类中。

XML配置:

<util:properties id="googleProperties" location="WEB-INF/google.properties" />

课程用法:

@Value("#{googleProperties['google.data.api.client.id']}")
private String clientId;

我的问题:

事实证明,clientIdclientSecret的值对于生产(在App Engine上部署时)和开发(在我的本地计算机上)需要不同。为了解决这个问题而不需要在部署时不断更改属性文件中的值,我一直在研究Spring的配置profiles,它允许我为生产和开发指定不同的属性文件。虽然我知道Spring配置文件是如何工作的on the documentation,但我不确定在这种特定情况下适当的解决方案是什么。

换句话说,如何根据我的应用程序是在本地部署还是在GAE上注入不同的属性文件?

2 个答案:

答案 0 :(得分:13)

有两种选择:


系统变量

您可以使用前缀来控制特定于环境的属性,这可以通过使用系统变量来完成:

 <util:properties id="googleProperties" 
                  location="WEB-INF/${ENV_SYSTEM:dev}/google.properties" />

在这种情况下,它总是在下面看:

 <util:properties id="googleProperties" 
                  location="WEB-INF/dev/google.properties" />

默认情况下,除非设置了ENV_SYSTEM系统变量。例如,如果它设置为qa,它将自动显示在:

 <util:properties id="googleProperties" 
                  location="WEB-INF/qa/google.properties" />

Spring Profiles

另一种方法是使bean配置文件具体化。例如:

<beans profile="dev">
    <util:properties id="googleProperties" 
                     location="WEB-INF/google-dev.properties" />
</beans>

<beans profile="qa">
    <util:properties id="googleProperties" 
                     location="WEB-INF/google-qa.properties" />
</beans>

将根据个人资料集加载相应的googleProperties。例如,这将加载WEB-INF/google-dev.properties

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();

答案 1 :(得分:0)

您走在正确的轨道上,在我们的应用程序中,我们有相同的场景,我们使用“配置文件”来管理属性。我们使用两个配置文件,一个用于生产,另一个用于测试配置文件。