1. Overview
In this tutorial, we’ll see how to inject a value to a static field with Spring.
2. Problem
To begin with, let’s imagine that we set a property to a properties file:
name = Inject a value to a static field
Afterward, we want to inject its value to an instance variable.
That usually can be done by using the @Value annotation on an instance field:
@Value("${name}")
private String name;
So, we may want to use @Value to inject some value to a static field:
@Component
public class StaticPropertyHolder {
@Value("${name}")
private static String STATIC_NAME_INJECTED_ON_FIELD;
public static String getStaticNameInjectedOnField() {
return STATIC_NAME_INJECTED_ON_FIELD;
}
}
However, when we try to apply it to a static field, we’ll find that it will still be null:
assertNull(StaticPropertyHolder.getStaticNameInjectedOnField());
That’s because Spring doesn’t support @Value on static fields.
Next, let’s figure out how to use the @Value annotation to inject a value to a static field.
3. Solution
First, let’s declare a new private static variable with the corresponding getter and setter:
private static String STATIC_NAME;
@Value("${name}")
public void setStaticName(String name) {
STATIC_NAME = name;
}
public static String getStaticName() {
return STATIC_NAME;
}
As we can see, we annotate the setter method with the @Value annotation.
This time, the expected value gets injected:
assertEquals("Inject a value to a static field", StaticPropertyHolder.getStaticName());
Spring uses dependency injection to populate the specific value when it finds the @Value annotation. However, instead of handing the value to the instance variable, it’s handed to the implicit setter instead. This setter then handles the population of our STATIC_NAME value.
4. Conclusion
In this short article, we’ve looked at how to inject a value from a properties file into a static variable. The key takeaway is using @Value on the setter method rather than on the static field itself.
As always, the code is available over on GitHub.