spring property substitution for test and production

several approaches:


1. ‘Order’ Property

in src/main/resources/your-conf.xml

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

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

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

If you running your test with src/test/resources as a test classpath, the above will ensure to override src/main/resources/esb-project-config.properties with the src/test/resources/esb-project-config.properties.

This will override the whole property-placeholder though, so you would have to provide all the properties needed in your application in for this test property-placeholder. e.g.

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

2. PropertyOverrideConfigurer

 <context:property-override 
          location="classpath:esb-project-config.test.properties"/>

to override certain individual properties. Some examples here


3. System Variables

You can use a prefix to control environment specific properties, this can be done by using system variables:

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

In this case it will always look under:

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

by default, unless a ENV_SYSTEM system variable is set. If it is set to qa, for example, it will automatically look under:

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

4. Spring Profiles

Another approach is to make beans profile specific. For example:

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

The appropriate esb-project-config will loaded depending on a profile set. For example this will load 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();

  • NOTE: “System Variables” and “System Profiles” approaches are usually used to switch between different environments rather than just “dev <==> test” in dev mode, but still are useful capabilities to be aware of.

Leave a Comment