56

If I have:

@Autowired private ApplicationContext ctx;

I can get beans and resources by using one of the the getBean methods. However, I can't figure out how to get property values.

Obviously, I can create a new bean which has an @Value property like:

private @Value("${someProp}") String somePropValue;

What method do I call on the ApplicationContext object to get that value without autowiring a bean?

I usually use the @Value, but there is a situation where the SPeL expression needs to be dynamic, so I can't just use an annotation.

HappyEngineer
  • 3,917
  • 9
  • 44
  • 58

3 Answers3

66

In the case where SPeL expression needs to be dynamic, get the property value manually:

somePropValue = ctx.getEnvironment().getProperty("someProp");
Italo Borssatto
  • 13,777
  • 7
  • 62
  • 83
  • 6
    Using Environment in runtime (as apposed to startup only) is usualy a very bad idea as it goes through JNDI and other locations looking for the value, which is expensive. – kaqqao Sep 04 '15 at 23:50
19

If you are stuck on Spring pre 3.1, you can use

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
Asa
  • 1,434
  • 14
  • 19
  • This is the answer that works for me with Spring 4.3.3. Only a context is needed, not a bean value placeholder. – Wheezil Jul 12 '19 at 13:57
18

Assuming that the ${someProp} property comes from a PropertyPlaceHolderConfigurer, that makes things difficult. The PropertyPlaceholderConfigurer is a BeanFactoryPostProcessor and as such only available at container startup time. So the properties are not available to a bean at runtime.

A solution would be to create some sort of a value holder bean that you initialize with the property / properties you need.

@Component
public class PropertyHolder{

    @Value("${props.foo}") private String foo;
    @Value("${props.bar}") private String bar;

    // + getter methods
}

Now inject this PropertyHolder wherever you need the properties and access the properties through the getter methods

Sean Patrick Floyd
  • 284,665
  • 62
  • 456
  • 576