Partner – Microsoft – NPI (cat= Spring)
announcement - icon

Azure Spring Apps is a fully managed service from Microsoft (built in collaboration with VMware), focused on building and deploying Spring Boot applications on Azure Cloud without worrying about Kubernetes.

And, the Enterprise plan comes with some interesting features, such as commercial Spring runtime support, a 99.95% SLA and some deep discounts (up to 47%) when you are ready for production.

>> Learn more and deploy your first Spring Boot app to Azure.

You can also ask questions and leave feedback on the Azure Spring Apps GitHub page.

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.

Course – LS (cat=Spring)

Get started with Spring and Spring Boot, through the Learn Spring course:

>> THE COURSE
res – REST with Spring (eBook) (everywhere)
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.