59

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
  • 4,017
  • 9
  • 46
  • 60

3 Answers3

70

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

somePropValue = ctx.getEnvironment().getProperty("someProp");
Italo Borssatto
  • 15,044
  • 7
  • 62
  • 88
  • 7
    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
21

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

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
Asa
  • 1,624
  • 15
  • 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
  • 292,901
  • 67
  • 465
  • 588