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

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

1. обзор

В этой быстрой статье мы перейдем кhave a look at the @Value Spring annotation.

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

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

Что такое бин весной?

Быстрое и практическое объяснение того, что такое Spring Bean.

Read more

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

Краткое и практическое руководство по установке значений по умолчанию при использовании аннотации @Value в Spring.

Read more

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.