springcode-injection

Spring: How to inject a value to static field?


With this class

@Component
public class Sample {

    @Value("${my.name}")
    public static String name;


}

If I try Sample.name, it is always 'null'. So I tried this.

public class Sample {

    public static String name;

    @PostConstruct
    public void init(){
        name = privateName;
    }

    @Value("${my.name}")
    private String privateName;

    public String getPrivateName() {
        return privateName;
    }

    public void setPrivateName(String privateName) {
        this.privateName = privateName;
    }  

}

This code works. Sample.name is set properly. Is this good way or not? If not, is there something more good way? And how to do it?


Solution

  • First of all, public static non-final fields are evil. Spring does not allow injecting to such fields for a reason.

    Your workaround is valid, you don't even need getter/setter, private field is enough. On the other hand try this:

    @Value("${my.name}")
    public void setPrivateName(String privateName) {
        Sample.name = privateName;
    }  
    

    (works with @Autowired/@Resource). But to give you some constructive advice: Create a second class with private field and getter instead of public static field.