Рубрики
Без рубрики

Аннотация @Value весной

@Value-это аннотация Java, используемая на уровне поля или метода/конструктора. Он обычно используется для ввода значений в переменные конфигурации. В этой статье мы рассмотрим множество способов использования аннотации @Value.

Автор оригинала: 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 только в инкапсулированных компонентах/службах (мы можем называть их службами конфигурации).

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