How to make spring inject value into a static field How to make spring inject value into a static field spring spring

How to make spring inject value into a static field


You have two possibilities:

  1. non-static setter for static property/field;
  2. using org.springframework.beans.factory.config.MethodInvokingFactoryBean to invoke a static setter.

In the first option you have a bean with a regular setter but instead setting an instance property you set the static property/field.

public void setTheProperty(Object value) {    foo.bar.Class.STATIC_VALUE = value;}

but in order to do this you need to have an instance of a bean that will expose this setter (its more like an workaround).

In the second case it would be done as follows:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">    <property name="staticMethod" value="foo.bar.Class.setTheProperty"/>    <property name="arguments">        <list>            <ref bean="theProperty"/>        </list>   </property></bean>

On you case you will add a new setter on the Utils class:

public static setDataBaseAttr(Properties p)

and in your context you will configure it with the approach exemplified above, more or less like:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">    <property name="staticMethod" value="foo.bar.Utils.setDataBaseAttr"/>    <property name="arguments">        <list>            <ref bean="dataBaseAttr"/>        </list>   </property></bean>


I've had a similar requirement: I needed to inject a Spring-managed repository bean into my Person entity class ("entity" as in "something with an identity", for example an JPA entity). A Person instance has friends, and for this Person instance to return its friends, it shall delegate to its repository and query for friends there.

@Entitypublic class Person {    private static PersonRepository personRepository;    @Id    @GeneratedValue    private long id;    public static void setPersonRepository(PersonRepository personRepository){        this.personRepository = personRepository;    }    public Set<Person> getFriends(){        return personRepository.getFriends(id);    }    ...}

.

@Repositorypublic class PersonRepository {    public Person get Person(long id) {        // do database-related stuff    }    public Set<Person> getFriends(long id) {        // do database-related stuff    }    ...}

So how did I inject that PersonRepository singleton into the static field of the Person class?

I created a @Configuration, which gets picked up at Spring ApplicationContext construction time. This @Configuration gets injected with all those beans that I need to inject as static fields into other classes. Then with a @PostConstruct annotation, I catch a hook to do all static field injection logic.

@Configurationpublic class StaticFieldInjectionConfiguration {    @Inject    private PersonRepository personRepository;    @PostConstruct    private void init() {        Person.setPersonRepository(personRepository);    }}


As these answers are old, I found this alternative. It is very clean and works with just java annotations:

To fix it, create a “none static setter” to assign the injected value for the static variable. For example :

import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class GlobalValue {public static String DATABASE;@Value("${mongodb.db}")public void setDatabase(String db) {    DATABASE = db;}}

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/