Альтернатива аннотации @Value в статической функции - PullRequest
7 голосов
/ 01 августа 2011

Невозможно использовать @Value для статической переменной.

@Value("${some.value}")
static private int someValue;

static public void useValue() {
    System.out.println(someValue);
}

Когда я это делаю, печатается 0.Так что же является хорошей альтернативой этому?

Ответы [ 3 ]

10 голосов
/ 01 августа 2011

Подпружиненная отметка в статическом поле (по умолчанию).

Таким образом, у вас есть два варианта:

  • (лучший вариант) сделать поле нестатичным
  • (уродливый хак) добавьте статический установщик без статических данных, который пишет в статическое поле, и добавьте аннотацию @Value в сеттер.

  • , а затем есть трюк с MethodInvokingFactoryBean - этот пример для автоматических полей, но я думаю, вы можете адаптировать его и для @Value тоже
5 голосов
/ 10 ноября 2016

Используйте этот простой трюк, чтобы достичь того, чего вы хотите (лучше, чем ввод значения в нестатические сеттеры и запись в статическое поле - как предложено в принятом ответе):

@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();

0 голосов
/ 14 мая 2013

К предотвращение повторяющихся инъекций одного и того же значения, делающего поле нестатичным в классе, который создается очень часто, я предпочел создать простой Singleton 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...