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

Краткое руководство по Spring @Value

Научитесь использовать аннотацию Spring @Value для настройки полей из файлов свойств, системных свойств и т. Д.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы рассмотрим аннотацию @Value Spring.

Эта аннотация может использоваться для ввода значений в поля в управляемых Spring компонентах, и она может применяться на уровне параметров поля или конструктора/метода.

Дальнейшее чтение:

Что такое Весенняя фасоль?

Использование Spring @Value по умолчанию

2. Настройка приложения

Чтобы описать различные виды использования этой аннотации, нам нужно настроить простой класс конфигурации приложения Spring.

Естественно, нам понадобится файл свойств , чтобы определить значения, которые мы хотим ввести с помощью аннотации @Value . Итак, сначала нам нужно определить @PropertySource в нашем классе конфигурации — с именем файла свойств.

Давайте определим файл свойств:

value.from.file=Value got from the file
priority=high
listOfValues=A,B,C

3. Примеры использования

В качестве основного и в основном бесполезного примера мы можем только ввести “строковое значение” из аннотации в поле:

@Value("string value")
private String stringValue;

Использование аннотации @PropertySource позволяет нам работать со значениями из файлов свойств с аннотацией @Value .

В следующем примере мы получаем Значение, полученное из файла , назначенного полю:

@Value("${value.from.file}")
private String valueFromFile;

Мы также можем задать значение из системных свойств с тем же синтаксисом.

Предположим, что мы определили системное свойство с именем системное значение :

@Value("${systemValue}")
private String systemValue;

Значения по умолчанию могут быть предоставлены для свойств, которые могут быть не определены. Здесь будет введено значение по умолчанию :

@Value("${unknown.param:some default}")
private String someDefault;

Если одно и то же свойство определено как системное свойство и в файле свойств, то будет применено системное свойство.

Предположим, у нас есть свойство priority , определенное как системное свойство со значением System property и определенное как что-то еще в файле свойств. Значение будет Системное свойство :

@Value("${priority}")
private String prioritySystemProperty;

Иногда нам нужно ввести кучу значений. Было бы удобно определить их как разделенные запятыми значения для одного свойства в файле свойств или как системное свойство и ввести в массив.

В первом разделе мы определили разделенные запятыми значения в списке Значений файла свойств , , чтобы значения массива были [“A”, “B”, “C”]:

@Value("${listOfValues}")
private String[] valuesArray;

4. Расширенные Примеры С Заклинанием

Мы также можем использовать выражения SpEL для получения значения.

Если у нас есть системное свойство с именем priority, , то его значение будет применено к полю:

@Value("#{systemProperties['priority']}")
private String spelValue;

Если мы не определили системное свойство, то будет присвоено значение null .

Чтобы предотвратить это, мы можем указать значение по умолчанию в выражении SpEL. Мы получаем некоторое значение по умолчанию для поля, если системное свойство не определено:

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

Кроме того, мы можем использовать значение поля из других компонентов. Предположим, у нас есть боб с именем некоторый боб с полем некоторым значением равным 10 . Затем, 10 будет присвоено полю:

@Value("#{someBean.someValue}")
private Integer someBeanValue;

Мы можем манипулировать свойствами, чтобы получить Список значений, здесь список строковых значений A, B и C:

@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;

5. Использование @Value С Картами

Мы также можем использовать аннотацию @Value для ввода свойства Map .

Во-первых, нам нужно будет определить свойство в форме {key: ‘value’ } в нашем файле свойств:

valuesMap={key1: '1', key2: '2', key3: '3'}

Обратите внимание, что значения в Карта должно быть в одинарных кавычках.

Теперь мы можем ввести это значение из файла свойств в виде Map :

@Value("#{${valuesMap}}")
private Map valuesMap;

Если нам нужно получить значение определенного ключа в Карте , все, что нам нужно сделать, это добавить имя ключа в выражение :

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

Если мы не уверены, содержит ли Map определенный ключ, мы должны выбрать более безопасное выражение, которое не вызовет исключения, но установит значение null , когда ключ не найден:

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

Мы также можем установить значения по умолчанию для свойств или ключей, которые могут не существовать :

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

Записи Map также могут быть отфильтрованы перед инъекцией.

Предположим, нам нужно получить только те записи, значения которых больше единицы:

@Value("#{${valuesMap}.?[value>'1']}")
private Map valuesMapFiltered;

Мы также можем использовать аннотацию @Value для ввода всех текущих свойств системы :

@Value("#{systemProperties}")
private Map systemPropertiesMap;

6. Использование @Value С Инъекцией Конструктора

Когда мы используем аннотацию @Value , мы не ограничиваемся введением поля. Мы также можем использовать его вместе с инъекцией конструктора.

Давайте посмотрим на это на практике:

@Component
@PropertySource("classpath:values.properties")
public class PriorityProvider {

    private String priority;

    @Autowired
    public PriorityProvider(@Value("${priority:normal}") String priority) {
        this.priority = priority;
    }

    // standard getter
}

В приведенном выше примере мы вводим приоритет непосредственно в конструктор нашего Поставщика приоритетов .

Обратите внимание, что мы также предоставляем значение по умолчанию в случае, если свойство не найдено.

7. Использование @Value С Инъекцией Сеттера

Аналогично инъекции конструктора, мы также можем использовать @Value с инъекцией сеттера.

Давайте посмотрим:

@Component
@PropertySource("classpath:values.properties")
public class CollectionProvider {

    private List values = new ArrayList<>();

    @Autowired
    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List values) {
        this.values.addAll(values);
    }

    // standard getter
}

Мы используем выражение SpEL для ввода списка значений в метод setValues .

8. Заключение

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

Как всегда, пример приложения доступен в проекте GitHub .