Как использовать аннотацию Spring @Value в переменных уровня класса

мне нужно использовать введенный параметр @Value в переменной экземпляра класса и может быть повторно использована эта переменная во всех ее дочерних классах.

   @Value(server.environment)
   public String environment;

   public String fileName = environment + "SomeFileName.xls";

здесь проблема заключается в инициализации имени файла, а затем происходит инъекция среды. Поэтому я всегда получаю null-SomeFileName.формате xls.

В любом случае, чтобы передать, чтобы инициализировать первый @Value весной.

2 ответов


можно использовать @PostConstruct Итак. От документация:

аннотация PostConstruct используется для метода, который должен быть выполняется после инъекции зависимостей для выполнения любых инициализация.

@PostConstruct позволяет выполнять модификацию после установки свойств. Одним из решений было бы что-то вроде этого:

public class MyService {

    @Value("${myProperty}")
    private String propertyValue;

    @PostConstruct
    public void init() {
        this.propertyValue += "/SomeFileName.xls";
    }

}

другим способом было бы использование @Autowired config-метод. От документация:

отмечает конструктор, поле, метод сеттера или метод конфигурации как быть autowired средствами впрыски зависимости весны.

...

методы Config могут иметь произвольное имя и любое количество аргументов; каждый из этих аргументов будет autowired с соответствующим Бобом в Контейнер весны. Методы сеттера свойств Bean эффективно просто частный случай такого общего метода config. Такие методы config do не обязательно быть публичным.

пример:

public class MyService {

    private String propertyValue;

    @Autowired
    public void initProperty(@Value("${myProperty}") String propertyValue) {
        this.propertyValue = propertyValue + "/SomeFileName.xls";
    }

}

разница в том, что при втором подходе у вас нет дополнительного крючка к вашему Бобу, вы адаптируете его, поскольку он автоматически подключается.


вы можете использовать @Value для чтения значений из файлов свойств, которые больше похожи на то, что вы хотите достичь.

Если вы настраиваете PropertySourcesPlaceholderConfigurer в методе конфигурации xml или bean, значение будет установлено spring для вас.

@Value("${server.env}")
private String serverEnv;

и конфигурации....

@Configuration
public class Cfg {
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    final PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setLocation(new ClassPathResource("/foo.properties"));
    return propertySourcesPlaceholderConfigurer;
    }
}

или подход xml

<context:property-placeholder location="classpath*:foo.properties"/>