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 ListvaluesList;
5. Использование @Value С Картами
Мы также можем использовать аннотацию @Value для ввода свойства Map .
Во-первых, нам нужно будет определить свойство в форме {key: ‘value’ } в нашем файле свойств:
valuesMap={key1: '1', key2: '2', key3: '3'}
Обратите внимание, что значения в Карта должно быть в одинарных кавычках.
Теперь мы можем ввести это значение из файла свойств в виде Map :
@Value("#{${valuesMap}}") private MapvaluesMap;
Если нам нужно получить значение определенного ключа в Карте , все, что нам нужно сделать, это добавить имя ключа в выражение :
@Value("#{${valuesMap}.key1}") private Integer valuesMapKey1;
Если мы не уверены, содержит ли Map определенный ключ, мы должны выбрать более безопасное выражение, которое не вызовет исключения, но установит значение null , когда ключ не найден:
@Value("#{${valuesMap}['unknownKey']}") private Integer unknownMapKey;
Мы также можем установить значения по умолчанию для свойств или ключей, которые могут не существовать :
@Value("#{${unknownMap : {key1: '1', key2: '2'}}}") private MapunknownMap; @Value("#{${valuesMap}['unknownKey'] ?: 5}") private Integer unknownMapKeyWithDefaultValue;
Записи Map также могут быть отфильтрованы перед инъекцией.
Предположим, нам нужно получить только те записи, значения которых больше единицы:
@Value("#{${valuesMap}.?[value>'1']}") private MapvaluesMapFiltered;
Мы также можем использовать аннотацию @Value для ввода всех текущих свойств системы :
@Value("#{systemProperties}") private MapsystemPropertiesMap;
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 Listvalues = new ArrayList<>(); @Autowired public void setValues(@Value("#{'${listOfValues}'.split(',')}") List values) { this.values.addAll(values); } // standard getter }
Мы используем выражение SpEL для ввода списка значений в метод setValues .
8. Заключение
В этой статье мы рассмотрели различные возможности использования аннотации @Value с простыми свойствами, определенными в файле, со свойствами системы и со свойствами, вычисляемыми с помощью выражений SpEL.
Как всегда, пример приложения доступен в проекте GitHub .