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

1 min


Вступление

Основная цель этой статьи – помочь вам понять, как Spring @Значение аннотации работ.

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

Основное назначение

Для самых простых примеров мы назначим значения трем различным полям, используя @Value аннотации, давая им явные значения:

@Value("John")
private String trainee;

@Value("100")
private int hoursOfCode;

@Value("true")
private boolean passedAssesmentTest;

Очень важно отметить, что аргумент, переданный @Value аннотация может быть только String, Spring преобразует значение в указанный тип, и присвоение будет выполнено без проблем – даже если мы передаем String значения для int или boolean переменные.

Весенняя среда

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

Мы будем использовать файл свойств по умолчанию для Spring Boot – 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, Весна назначит Sedan к 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 в методе все аргументы будут сопоставлены со значением, указанным в аннотации:

@Value("${car.brand}")
public CarData setCarData(String color, String brand) {
    carData.setCarColor(color);
    carData.setCarBrand(brand);
}

Если мы печатаем carData.getCarColor() и carData.getCarBrand() мы получим 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 значение, потому что мы предоставили значение для параметра самого метода.

Spring Expression Language (SpEL)

Spring Expression Language (SpEL) – это язык выражений, который служит основой для оценки выражений в портфолио Spring.

В основном, при использовании SpEL вместе с @Value аннотация, мы просто меняем способ сказать Spring, что нам нужно. Давайте внимательнее посмотрим:

@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 аннотаций. Например, давайте сделаем Map это представляет indoor и outdoor увлечения студента. Каждый из них может иметь несколько значений:

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

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


0 Comments

Ваш адрес email не будет опубликован. Обязательные поля помечены *