Автор оригинала: 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 Mapproperties;
Теперь мы знаем, что мы можем использовать аннотацию @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 ListbooksRead;
Вывод
Как только вы закончите работать над реальным приложением, вы поймете, что конфигурация-важная тема, и если вы используете Spring. Есть большая вероятность, что вы уже используете или вам придется широко использовать аннотацию @Value
.
Понимание этой базовой функциональности очень важно, потому что, если вы этого не сделаете, вы можете в конечном итоге использовать ее совершенно неправильно.
Мы также должны понимать, что не все, что выглядит простым, также очень хорошо подходит для долгосрочных решений. Например, мы должны использовать @Value
только в инкапсулированных компонентах/службах (мы можем называть их службами конфигурации).
Таким образом, у нас будут все наши конфигурации в одном месте, и этот компонент будет отвечать только за загрузку и предоставление их другим компонентам.