首先,一些背景:
我目前正在开展一个项目,在该项目中,我使用Google的AppEngine(GAE)上的Spring框架从Google的一项服务中获取一些数据。为此,我使用了Google的OAuth工具。为此,我需要使用特定于我的应用程序的clientSecret
和clientId
。由于这些是静态配置值,我使用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;
我的问题:
事实证明,clientId
和clientSecret
的值对于生产(在App Engine上部署时)和开发(在我的本地计算机上)需要不同。为了解决这个问题而不需要在部署时不断更改属性文件中的值,我一直在研究Spring的配置profiles
,它允许我为生产和开发指定不同的属性文件。虽然我知道Spring配置文件是如何工作的on the documentation,但我不确定在这种特定情况下适当的解决方案是什么。
换句话说,如何根据我的应用程序是在本地部署还是在GAE上注入不同的属性文件?
答案 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" />
另一种方法是使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)
您走在正确的轨道上,在我们的应用程序中,我们有相同的场景,我们使用“配置文件”来管理属性。我们使用两个配置文件,一个用于生产,另一个用于测试配置文件。