Spring:根据配置文件注入不同的属性文件
首先,一些背景:
我目前正在开发一个项目,我在其中使用Google的AppEngine(GAE)上的Spring框架从Google的一项服务中获取一些数据。 为此,我使用了Google的OAuth工具。 为此,我需要使用特定于我的应用程序的clientSecret
和clientId
。 由于这些是静态配置值,我使用Spring的 ( 链接到文档 )function将这些值插入到适当的类中。
XML配置:
课程用法:
@Value("#{googleProperties['google.data.api.client.id']}") private String clientId;
我的问题:
事实certificate, clientId
和clientSecret
的值对于生产(在App Engine上部署时)和开发(在我的本地机器上)需要不同。 为了解决这个问题而不需要在部署时不断更改属性文件中的值,我一直在研究Spring的配置profiles
,这些配置profiles
允许我为生产和开发指定不同的属性文件。 虽然我知道Spring配置文件是如何基于文档工作的,但我不确定在这种特定情况下适当的解决方案是什么。
换句话说,我如何根据我的应用程序是在本地部署还是在GAE上注入不同的属性文件?
有两种选择:
系统变量
您可以使用前缀来控制特定于环境的属性,这可以通过使用系统变量来完成:
在这种情况下,它总是在下面看:
默认情况下 ,除非设置了ENV_SYSTEM
系统变量。 例如,如果将其设置为qa
,它将自动显示在:
弹簧轮廓
另一种方法是使bean配置文件具体化。 例如:
将根据配置文件集加载相应的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();
您处于正确的轨道上,在我们的应用程序中,我们有相同的场景,我们使用“配置文件”来管理属性。 我们使用两个配置文件,一个用于生产,另一个用于相应地设置配置文件。