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

首先,一些背景:

我目前正在开发一个项目,我在其中使用Google的AppEngine(GAE)上的Spring框架从Google的一项服务中获取一些数据。 为此,我使用了Google的OAuth工具。 为此,我需要使用特定于我的应用程序的clientSecretclientId 。 由于这些是静态配置值,我使用Spring的 ( 链接到文档 )function将这些值插入到适当的类中。

XML配置:

  

课程用法:

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

我的问题:

事实certificate, clientIdclientSecret的值对于生产(在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(); 

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