Автор оригинала: 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 ListunexpectedListOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() { assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings); }
Наш Список содержит один элемент, равный значению, которое мы задаем в нашем файле свойств.
Чтобы правильно ввести List , нам нужно использовать специальный синтаксис, называемый Spring Expression Language (SpEL):
@Value("#{'${arrayOfStrings}'.split(',')}") private ListlistOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }
Мы видим, что наше выражение начинается с # вместо $ , к которому мы привыкли с @Value .
Мы также должны отметить, что мы вызываем расщеплять метод, который делает выражение немного более сложным, чем обычная инъекция.
Если мы хотим, чтобы наше выражение было немного проще, мы можем объявить наше свойство в специальном формате:
listOfStrings={'Baeldung','dot','com'}
Spring распознает этот формат, и мы сможем ввести наш List , используя несколько более простое выражение:
@Value("#{${listOfStrings}}") private ListlistOfStringsV2;
@Test void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2); }
4. Использование Пользовательских Разделителей
Давайте создадим аналогичное свойство, но на этот раз мы будем использовать другой разделитель:
listOfStringsWithCustomDelimiter=Baeldung;dot;com
Как мы уже видели при инъекции Списки , , мы можем использовать специальное выражение, в котором мы можем указать желаемый разделитель:
@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}") private ListlistOfStringsWithCustomDelimiter;
@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 ListlistOfBooleans; @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); ListlistOfStrings = (List )environment.getProperty("arrayOfStrings", List.class); assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }
7. Заключение
В этом кратком руководстве мы узнали, как легко вводить массивы и List s с помощью быстрых и практических примеров.
Как всегда, код доступен на GitHub .