How to make spring inject value into a static field
You have two possibilities:
- non-static setter for static property/field;
- 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/