Comment faire en sorte que le spring injecte de la valeur dans un champ statique

Je sais que cela peut ressembler à une question posée précédemment, mais je suis confronté à un problème différent ici.

J’ai une classe d’utilitaire qui n’a que des méthodes statiques. Je ne le fais pas et je n’en prendrai pas d’instance.

public class Utils{ private static Properties dataBaseAttr; public static void methodA(){ } public static void methodB(){ } } 

Maintenant, j’ai besoin de Spring pour remplir dataBaseAttr avec les atsortingbuts de firebase database Properties.Spring config est:

     

Je l’ai déjà fait dans d’autres beans mais le problème ici dans cette classe (Utils) n’est pas un bean, et si je fais un bean rien ne change je ne peux toujours pas utiliser la variable puisque la classe ne sera pas instanciée et variable toujours est égal à null.

Vous avez deux possibilités:

  1. setter non statique pour propriété / champ statique;
  2. en utilisant org.springframework.beans.factory.config.MethodInvokingFactoryBean pour appeler un setter statique.

Dans la première option, vous avez un bean avec un setter régulier, mais au lieu de définir une propriété d’instance, vous définissez la propriété / le champ static.

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

mais pour ce faire, vous devez avoir une instance d’un bean qui exposera ce setter (c’est plutôt une solution de contournement ).

Dans le second cas, cela se ferait comme suit:

         

Dans votre cas, vous appendez un nouveau setter sur la classe Utils :

 public static setDataBaseAttr(Properties p) 

et dans votre contexte, vous allez le configurer avec l’approche illustrée ci-dessus, plus ou moins semblable à:

         

J’ai eu une exigence similaire: j’avais besoin d’injecter un bean de référentiel géré par Spring dans ma classe d’entité Person (“entity” comme dans “quelque chose avec une identité”, par exemple une entité JPA). Une instance de Person a des amis, et pour que cette instance de Person renvoie ses amis, elle doit déléguer à son référentiel et y rechercher des amis.

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

.

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

Alors, comment ai-je PersonRepository singleton PersonRepository dans le champ statique de la classe Person ?

J’ai créé une @Configuration , qui est captée au moment de la construction de Spring ApplicationContext . Cette @Configuration est injectée avec tous les beans que je dois injecter en tant que champs statiques dans d’autres classes. Ensuite, avec une annotation @PostConstruct , @PostConstruct un crochet pour effectuer toute la logique d’injection de champ statique.

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