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.