一尘不染

spring property substitution for test and production

spring

我在spring遇到这个问题

<context:property-placeholder location="esb-project-config.properties"/>

但是不幸的是,我们不想在xml文件中使用它,因为我们想在测试中重新使用该文件,但要交换test.properties文件进行测试。即。我们要测试所有生产绑定,但是要使用适合于测试的属性,例如localhost。如何加载具有不同属性文件的ApplicationContext?


阅读 324

收藏
2020-04-15

共2个答案

一尘不染

将property-placeholder配置放入额外的spring xml配置文件中。

例如:

  • applicationContext.xml -用于没有任何属性占位符配置的常规配置
  • applicationContext-config.xml -仅包含加载生产配置文件的属性占位符。
  • testApplicationContext.xml。该文件include为,applicationContext.xml并与其他属性文件一起使用属性占位符。

在Web App中,你可以使用此模式加载所有生产Spring上下文文件applicationContext*.xml

对于测试,你仅需要加载,testApplicationContext.xml它将包括常规配置,但具有其他属性。

2020-04-15
一尘不染

几种方法:

1.“Order”属性

src/main/resources/your-conf.xml

<context:property-placeholder 
         location="classpath:esb-project-config.properties"
         order="1"/>

src/test/resources/your-test-config.xml

<context:property-placeholder 
         location="classpath:esb-project-config.properties"
         order="0"/>

如果你运行测试src/test/resources作为测试类路径,上面将确保覆盖src/main/resources/esb-project-config.properties用src/test/resources/esb-project-config.properties

property-placeholder但是,这将覆盖整个实例,因此你必须在此测试中提供应用程序所需的所有属性property-placeholder。例如

<context:property-placeholder 
         location="classpath:esb-project-config.properties,
                   classpath:some-other-props-if-needed.properties"
         order="0"/>
  1. PropertyOverrideConfigurer
 <context:property-override 
          location="classpath:esb-project-config.test.properties"/>

覆盖某些单独的属性。这里的一些例子

3.系统变量

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

 <context:property-placeholder 
          location="${ENV_SYSTEM:dev}/esb-project-config.properties"/>

在这种情况下,它将始终处于以下状态:

 <context:property-placeholder 
          location="dev/esb-project-config.properties"/>

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

 <context:property-placeholder 
          location="qa/esb-project-config.properties"/>

4.spring概况
另一种方法是使bean配置文件特定。例如:

<beans profile="dev">
  <context:property-placeholder 
           location="esb-project-config.dev.properties"/>
</beans>

<beans profile="qa">
  <context:property-placeholder 
           location="esb-project-config.qa.properties"/>
</beans>

esb-project-config将根据配置文件集加载适当的文件。例如,这将加载esb-project-config.dev.properties

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();
  • 注意:“系统变量”和“系统配置文件”方法通常用于在不同的环境之间切换,而不仅仅是在开发人员模式下进行“开发<==>测试”,但是仍然需要注意有用的功能。
2020-04-15