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

Ввод Массивов и Списков Из Файлов Свойств Spring

Изучите различные способы использования @Value и SpEL для ввода значений свойств в виде массивов или списков в Spring

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

1. Обзор

В этом кратком руководстве мы узнаем, как вводить значения в массив или Список из файла свойств Spring.

2. Поведение по умолчанию

Начнем с простого файла application.properties :

arrayOfStrings=Baeldung,dot,com

Давайте посмотрим, как ведет себя Spring, когда мы устанавливаем наш тип переменной в String[] :

@Value("${arrayOfStrings}")
private String[] arrayOfStrings;
@Test
void whenContextIsInitialized_thenInjectedArrayContainsExpectedValues() {
    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
}

Мы видим, что Spring правильно предполагает, что наш разделитель-запятая, и инициализирует массив соответствующим образом.

Следует также отметить, что по умолчанию инъекция массива работает корректно только тогда, когда у нас есть значения, разделенные запятыми.

3. Инъекционные Списки

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

@Value("${arrayOfStrings}")
private List unexpectedListOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() {
    assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings);
}

Наш Список содержит один элемент, равный значению, которое мы задаем в нашем файле свойств.

Чтобы правильно ввести List , нам нужно использовать специальный синтаксис, называемый Spring Expression Language (SpEL):

@Value("#{'${arrayOfStrings}'.split(',')}")
private List listOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

Мы видим, что наше выражение начинается с # вместо $ , к которому мы привыкли с @Value .

Мы также должны отметить, что мы вызываем расщеплять метод, который делает выражение немного более сложным, чем обычная инъекция.

Если мы хотим, чтобы наше выражение было немного проще, мы можем объявить наше свойство в специальном формате:

listOfStrings={'Baeldung','dot','com'}

Spring распознает этот формат, и мы сможем ввести наш List , используя несколько более простое выражение:

@Value("#{${listOfStrings}}")
private List listOfStringsV2;
@Test
void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2);
}

4. Использование Пользовательских Разделителей

Давайте создадим аналогичное свойство, но на этот раз мы будем использовать другой разделитель:

listOfStringsWithCustomDelimiter=Baeldung;dot;com

Как мы уже видели при инъекции Списки , , мы можем использовать специальное выражение, в котором мы можем указать желаемый разделитель:

@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}")
private List listOfStringsWithCustomDelimiter;
@Test
void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter);
}

5. Инъекции Других Типов

Давайте рассмотрим следующие свойства:

listOfBooleans=false,false,true
listOfIntegers=1,2,3,4
listOfCharacters=a,b,c

Мы видим, что Spring поддерживает базовые типы из коробки, поэтому нам не нужно делать никакого специального разбора:

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

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

@Value("#{'${listOfCharacters}'.split(',')}")
private List listOfCharacters;
@Test
void whenContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues() {
    assertEquals(Arrays.asList(false, false, true), listOfBooleans);
    assertEquals(Arrays.asList(1, 2, 3, 4), listOfIntegers);
    assertEquals(Arrays.asList('a', 'b', 'c'), listOfCharacters);
}

Это поддерживается только с помощью заклинания, поэтому мы не можем ввести массив таким же образом.

6. Чтение Свойств Программно

Чтобы программно прочитать свойства, нам сначала нужно получить экземпляр нашего объекта Environment :

@Autowired
private Environment environment;

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

@Test
void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() {
    String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class);
    List listOfStrings = (List)environment.getProperty("arrayOfStrings", List.class);

    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

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

В этом кратком руководстве мы узнали, как легко вводить массивы и List s с помощью быстрых и практических примеров.

Как всегда, код доступен на GitHub .