Автор оригинала: Guest Contributor.
Вступление
Основная цель этой статьи-помочь вам понять, как работает аннотация Spring @Value .
@Value – это аннотация Java, которая используется на уровне параметров поля или метода/конструктора и указывает значение по умолчанию для соответствующего аргумента. Он обычно используется для ввода значений в переменные конфигурации, которые мы покажем и объясним в следующей части статьи.
Основное Задание
Для самых простых примеров мы присвоим значения трем различным полям, используя аннотацию @Value , указав им явные значения:
@Value("John")
private String trainee;
@Value("100")
private int hoursOfCode;
@Value("true")
private boolean passedAssesmentTest;
Очень важно отметить, что аргумент, передаваемый в аннотацию @Value , может быть только Строкой . Spring преобразует значение в указанный тип, и присвоение будет выполнено без каких – либо проблем-даже если мы передаем Строковые значения в int или логические переменные.
Весенняя Среда
Ввод значений из файлов свойств с помощью @Value аннотации, вероятно, является наиболее часто используемым вариантом использования в реальных приложениях.
Мы будем использовать файл свойств по умолчанию для весенней загрузки – application.properties , где мы можем определить переменные, к которым мы сможем получить доступ впоследствии:
car.brand=Audi car.color=Red car.power=150
@Value("${car.brand")
private String brand;
@Value("${car.color}")
private String color;
@Value("${car.power}")
private int power;
В этом примере значения переменных считываются из файла application.properties и присваиваются им во время создания компонента.
В большинстве случаев мы использовали бы этот подход для ввода значений конфигурации из файла application.properties в компоненты.
Значение по умолчанию
Значения по умолчанию используются в качестве “запасного варианта”, если свойство, которое мы хотим ввести, не определено или отсутствует:
@Value("${car.type:Sedan}")
private String type;
В приведенном выше примере, поскольку у нас нет car.type свойства в application.properties , Spring назначит Седан переменной type в качестве значения по умолчанию.
Если свойство car.type будет вставлено в файл свойств, вместо него будет использоваться новое значение.
Системные переменные
Мы также можем получить доступ к системным переменным, которые хранятся в качестве свойств приложением Spring при запуске:
@Value("${user.name}")
// Or
@Value("${username}")
private String userName;
@Value("${number.of.processors}")
// Or
@Value("${number_of_processors}")
private int numberOfProcessors;
@Value("${java.home}")
private String java;
Переменные могут быть вызваны с различными соглашениями об именовании – Spring ищет нас и присваивает правильное значение.
Значение глобального метода
Поскольку @Value обрабатывается классом BeanPostProcessor , он будет вызван, когда Spring создает контекст Spring путем создания экземпляров файлов конфигурации и компонентов.
Это означает, что при наличии @Значения в методе все аргументы будут сопоставлены со значением, указанным в аннотации:
@Value("${car.brand}")
public CarData setCarData(String color, String brand) {
carData.setCarColor(color);
carData.setCarBrand(brand);
}
Если мы печатаем carData.getCarColor() и carData.get Марка автомобиля() мы получим значение car.brand оба раза, потому что, как мы уже сказали, все аргументы будут сопоставлены с предоставленным значением.
Значение метода параметра
Мы можем исправить это, используя @Value непосредственно в параметре метода:
@Value("${car.brand}")
public CarData setCarData(@Value("${car.color}") String color, String brand) {
carData.setCarColor(color);
carData.setCarBrand(brand);
}
Теперь, если мы печатаем значения из объекта carData – поле цвета будет иметь значение car.color , потому что мы предоставили значение параметру самого метода.
Язык весеннего выражения (SpEL)
Язык выражений Spring (SpEL) – это язык выражений, который служит основой для оценки выражений в портфолио Spring.
В принципе, при использовании заклинания вместе с аннотацией @Value мы просто меняем способ, которым мы сообщаем Spring, что нам нужно. Давайте посмотрим поближе:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
@Value("#{systemProperties['user.name']}")
private String userName;
Вот как вы вводите определенное системное свойство. С другой стороны, мы могли бы ввести все свойства с помощью:
@Value("#{systemProperties}")
private Map properties;
Теперь мы знаем, что мы можем использовать аннотацию @Value для методов в качестве глобального значения или в качестве значения параметра.
Поскольку конструкторы по сути являются методами, мы также можем использовать аннотации в конструкторах:
public Driver(@Value("#{systemProperties['user.name']}") String name, String location) {
this.name = name;
this.location = location;
}
Внедрение в карты
С помощью SpEL мы можем делать некоторые другие довольно интересные вещи в сочетании с аннотацией @Value . Например, давайте составим Карту , которая представляет внутренние и наружные увлечения студента. Каждый из них может иметь несколько значений:
student.hobbies={indoor: 'reading, drawing', outdoor: 'fishing, hiking, bushcraft'}
Теперь, чтобы ввести это, нам понадобится Map<Строка, Список<Строка>> :
@Value("#{${student.hobbies}}")
private Map> hobbies;
Введение в списки
Если свойство имеет значения, разделенные запятыми, например, простой список книг, мы можем использовать SpEL для его интерпретации и преобразования в список:
student.booksRead=Harry Potter,The Hobbit,Game of Thrones
Используя метод split() и разделение для каждой запятой ( , ), мы можем ввести эти значения в список:
@Value("#{'${student.booksRead}'.split(',')}")
private List booksRead;
Вывод
Как только вы закончите работать над реальным приложением, вы поймете, что конфигурация-важная тема, и если вы используете Spring. Есть большая вероятность, что вы уже используете или вам придется широко использовать аннотацию @Value .
Понимание этой базовой функциональности очень важно, потому что, если вы этого не сделаете, вы можете в конечном итоге использовать ее совершенно неправильно.
Мы также должны понимать, что не все, что выглядит простым, также очень хорошо подходит для долгосрочных решений. Например, мы должны использовать @Value только в инкапсулированных компонентах/службах (мы можем называть их службами конфигурации).
Таким образом, у нас будут все наши конфигурации в одном месте, и этот компонент будет отвечать только за загрузку и предоставление их другим компонентам.