Как использовать аннотацию 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"/>