Uma alternativa para a anotação @Value na function estática

Não é possível usar @Value em uma variável estática.

 @Value("${some.value}") static private int someValue; static public void useValue() { System.out.println(someValue); } 

Quando faço isso, 0 é impresso. Então, qual é uma boa alternativa para isso?

Injeção de mola anotando no campo estático (por padrão).

Então você tem duas alternativas:

  • (melhor) tornar o campo não estático
  • (o hack feio) adicione nenhum setter estático que escreve no campo estático, e adicione a anotação @Value ao setter.

  • e depois há o truque com o MethodInvokingFactoryBean – este exemplo é para campos autowired, mas eu acho que você pode adaptá-lo para @Value também

Use este truque simples para conseguir o que você quer (muito melhor do que ter o valor injetado em setters não estáticos e escrever um campo estático – como sugerido na resposta aceita):

 @Service public class ConfigUtil { public static ConfigUtil INSTANCE; @Value("${some.value}) private String value; @PostConstruct public void init() { INSTANCE = this; } public String getValue() { return value; } } 

Use como:

ConfigUtil.INSTANCE.getValue();

Para evitar a repetição de injeções do mesmo valor, tornando um campo não estático em uma class que é instanciada com muita frequência, preferi criar um ConfigUtil Singleton simples como uma solução alternativa:

 package de.agitos.app.util; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.beans.factory.annotation.Value; /** * Helper class to get injected configuration values from static methods * * @author Florian Sager * */ @Configurable public class ConfigUtil { private static ConfigUtil instance = new ConfigUtil(); public static ConfigUtil getInstance() { return instance; } private @Value("${my.value1}") Integer value1; public Integer getValue1() { return value1; } } 

Dentro da class eu tentei injetar o valor primeiro como um inteiro estático:

 private static Integer value1 = ConfigUtil.getInstance().getValue1();