Como fazer com que a mola injete valor em um campo estático

Eu sei que isso pode parecer uma pergunta feita anteriormente, mas estou enfrentando um problema diferente aqui.

Eu tenho uma class de utilitário que tem apenas methods estáticos. Eu não e não vou tomar um exemplo disso.

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

Agora preciso que o Spring preencha o dataBaseAttr com os atributos do database. A configuração do Properties.Spring é:

     

Eu já fiz isso em outros beans mas o problema aqui nessa class (Utils) não é um bean, E se eu fizer um bean nada muda ainda não consigo usar a variável pois a class não será instanciada e variável sempre é igual a null.

Você tem duas possibilidades:

  1. setter não estático para propriedade / campo estático;
  2. usando org.springframework.beans.factory.config.MethodInvokingFactoryBean para invocar um setter estático.

Na primeira opção, você tem um bean com um setter regular, mas, em vez de definir uma propriedade de instância, você define a propriedade / campo estático.

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

mas para fazer isso você precisa ter uma instância de um bean que exponha este setter (é mais como uma solução alternativa ).

No segundo caso, seria feito da seguinte maneira:

         

No seu caso, você adicionará um novo setter na class Utils :

 public static setDataBaseAttr(Properties p) 

e no seu contexto você irá configurá-lo com a abordagem exemplificada acima, mais ou menos como:

         

Eu tive um requisito semelhante: eu precisava injetar um bean de repository gerenciado pelo Spring em minha class de entidade Person (“entity” como em “alguma coisa com uma identidade”, por exemplo, uma entidade JPA). Uma instância Person possui amigos e, para essa instância Person retornar seus amigos, ela deve delegar ao seu repository e consultar amigos lá.

 @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 } ... } 

Então, como eu injetar esse singleton PersonRepository no campo estático da class Person ?

Eu criei um @Configuration , que é escolhido no momento da construção do Spring ApplicationContext . Essa @Configuration é injetada com todos os beans que preciso injetar como campos estáticos em outras classs. Então, com uma anotação @PostConstruct , eu pego um gancho para fazer toda a lógica de injeção de campo estático.

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