Краткое руководство по Spring @Value
1. обзор
В этой быстрой статье мы перейдем кhave a look at the @Value Spring annotation.
Эта аннотация может использоваться для введения значений в поля в bean-компонентах, управляемых Spring, и может применяться на уровне параметров поля или конструктора / метода.
Дальнейшее чтение:
Использование Spring @Value со значениями по умолчанию
Краткое и практическое руководство по установке значений по умолчанию при использовании аннотации @Value в Spring.
2. Настройка приложения
Чтобы описать различные виды использования этой аннотации, нам нужно настроить простой класс конфигурации приложения Spring.
И, естественно,we’ll need a properties file для определения значений, которые мы хотим ввести с аннотацией@Value. Итак, сначала нам нужно определить@PropertySource в нашем классе конфигурации - с именем файла свойств.
Давайте определим файл свойств:
value.from.file=Value got from the file
priority=Properties file
listOfValues=A,B,C
3. Примеры использования
В качестве базового и в основном бесполезного примера использования мы можем только вставить «строковое значение» из аннотации в поле:
@Value("string value")
private String stringValue;
Использование аннотации@PropertySource позволяет нам работать со значениями из файлов свойств с аннотацией@Value. В следующем примере мы получаем“Value got from the file”, назначенный полю:
@Value("${value.from.file}")
private String valueFromFile;
Мы также можем установить значение из системных свойств с тем же синтаксисом. Предположим, что мы определили системное свойство с именемsystemValue, и рассмотрим следующий пример:
@Value("${systemValue}")
private String systemValue;
Значения по умолчанию могут быть предоставлены для свойств, которые могут быть не определены. В этом примере будет введено значение“some default”:
@Value("${unknown.param:some default}")
private String someDefault;
Если одно и то же свойство определено как системное свойство и в файле свойств, то будет применено системное свойство.
Предположим, у нас есть свойствоpriority, определенное как системное свойство со значением“System property” и определенное как что-то еще в файле свойств. В следующем коде значение будет“System property”:
@Value("${priority}")
private String prioritySystemProperty;
Иногда нам нужно ввести кучу ценностей. Было бы удобно определить их как разделенные запятыми значения для одного свойства в файле свойств или как системное свойство и вставить в массив. В первом разделе мы определили значения, разделенные запятыми, вlistOfValues файла свойств,, поэтому в следующем примере значениями массива будут[“A”, “B”, “C”]:
@Value("${listOfValues}")
private String[] valuesArray;
4. Расширенные примеры с SpEL
Мы также можем использовать выражения SpEL для получения значения. Если у нас есть системное свойство с именемpriority,, то его значение будет применено к полю в следующем примере:
@Value("#{systemProperties['priority']}")
private String spelValue;
Если мы не определили системное свойство, то будет присвоено значениеnull. Чтобы предотвратить это, мы можем предоставить значение по умолчанию в выражении SpEL. В следующем примере мы получаем значение“some default” для поля, если системное свойство не определено:
@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;
Кроме того, мы можем использовать значение поля из других bean-компонентов. Предположим, у нас есть компонент с именемsomeBean с полемsomeValue, равным10. Тогда10 будет назначен полю в этом примере:
@Value("#{someBean.someValue}")
private Integer someBeanValue;
Мы можем манипулировать свойствами, чтобы получитьList значений. В следующем примере мы получаем список строковых значений A, B и C:
@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;
5. Использование@Value сMaps
Мы также можем использовать аннотацию@Value, чтобы добавить свойствоMap.
Во-первых, нам нужно определить свойство в форме\{key: ‘value' } form в нашем файле свойств:
valuesMap={key1: '1', key2: '2', key3: '3'}
Обратите внимание, что значения вMap должны быть в одинарных кавычках.
Теперь мы можем ввести это значение из файла свойств какMap:
@Value("#{${valuesMap}}")
private Map valuesMap;
Если нам нуженto get the value of a specific key вMap, все, что нам нужно сделать, этоadd the key’s name in the expression:
@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;
Если мы не уверены, содержит лиMap определенный ключ, мы должны выбратьa safer expression that will not throw an exception but set the value to null, когда ключ не найден:
@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;
Мы также можемset default values for the properties or keys that might not exist:
@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map unknownMap;
@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;
Map entries can also be filtered перед закачкой. Предположим, нам нужно получить только те записи, значения которых больше единицы:
@Value("#{${valuesMap}.?[value>'1']}")
private Map valuesMapFiltered;
Мы также можем использовать аннотацию@Value кinject all current system properties:
@Value("#{systemProperties}")
private Map systemPropertiesMap;
6. Заключение
В этом кратком руководстве мы рассмотрели различные возможности использования аннотации@Value с простыми свойствами, определенными в файле, с системными свойствами и со свойствами, вычисленными с помощью выражений SpEL.
Как всегда, доступен пример приложенияon GitHub project.