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

2022-09-04 03:24:54

首先,一些上下文:

我目前正在做一个项目,在这个项目中,我使用谷歌AppEngine(GAE)上的Spring框架从谷歌的一个服务中获取一些数据。为此,我利用了谷歌的OAuth设施。为此,我需要使用特定于我的应用程序的 和。由于这些是静态配置值,因此我使用Spring的(链接到文档)功能将这些值插入到适当的类中。clientSecretclientId<util:properties>

XML 配置:

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

类用法:

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

我的问题:

事实证明,生产(在 App Engine 上部署时)和开发(在我的本地计算机上)的值和需要有所不同。为了解决这个问题,而又不需要在部署时经常更改属性文件中的值,我一直在研究Spring的配置,该配置将允许我为生产和开发指定不同的属性文件。虽然我对Spring配置文件的工作原理有一个想法,但我完全不确定在这种特殊情况下合适的解决方案是什么。clientIdclientSecretprofiles

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


答案 1

几个选项:


系统变量

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

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

在这种情况下,它将始终在以下位置查找:

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

默认情况下,除非设置了系统变量。例如,如果它设置为 ,它将自动在以下位置查找:ENV_SYSTEMqa

 <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>

将根据配置文件集加载相应的内容。例如,这将加载:googlePropertiesWEB-INF/google-dev.properties

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

答案 2

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


推荐