Альтернатива аннотации @Value в статической функции
невозможно использовать @Value
на статической переменной.
@Value("${some.value}")
static private int someValue;
static public void useValue() {
System.out.println(someValue);
}
когда я это делаю,0
печати. Так что же является хорошей альтернативой этому?
3 ответов
Spring inject noting в статическом поле (по умолчанию).
Итак, у вас есть две альтернативы:
- (лучший) сделайте поле нестатическим
- (уродливый Хак) добавьте статический сеттер none, который пишет в статическом поле, и добавьте
@Value
аннотация к сеттера.
- и тогда есть трюк с MethodInvokingFactoryBean -- этот пример для autowired полей, но я думаю, что вы может адаптировать его для
@Value
слишком
используйте этот простой трюк, чтобы достичь того, что вы хотите (лучше, чем иметь значение, введенное в нестатические сеттеры и писать так статическое поле - как предложено в принятом ответе):
@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;
}
}
Как использовать:
ConfigUtil.INSTANCE.getValue();
до предотвратите когда-либо повторяющиеся инъекции одного и того же значения, делая поле нестатическим в классе, который создается очень часто, я предпочел создать простой одноэлементный ConfigUtil в качестве обходного пути:
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;
}
}
внутри класса я попытался ввести значение сначала как статическое целое число:
private static Integer value1 = ConfigUtil.getInstance().getValue1();