«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. Внедрение списков
@Value("${arrayOfStrings}")
private List<String> unexpectedListOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() {
assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings);
}
Если мы попытаемся внедрить список таким же образом, то получим удивительный результат:
@Value("#{'${arrayOfStrings}'.split(',')}")
private List<String> listOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsExpectedValues() {
assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}
Наш список содержит единственный элемент, равный значение, которое мы установили в нашем файле свойств.
Чтобы правильно внедрить список, нам нужно использовать специальный синтаксис, называемый Spring Expression Language (SpEL):
listOfStrings={'Baeldung','dot','com'}
Мы видим, что наше выражение начинается с # вместо $, который мы привыкли к @Value.
@Value("#{${listOfStrings}}")
private List<String> listOfStringsV2;
@Test
void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() {
assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2);
}
Следует также отметить, что мы вызываем метод разделения, что делает выражение немного более сложным, чем обычное внедрение.
Если мы хотим немного упростить наше выражение, мы можем объявить наше свойство в специальном формате:
listOfStringsWithCustomDelimiter=Baeldung;dot;com
Spring распознает этот формат, и мы сможем внедрить наш список с помощью несколько более простое выражение:
@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}")
private List<String> listOfStringsWithCustomDelimiter;
@Test
void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() {
assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter);
}
4. Использование настраиваемых разделителей
listOfBooleans=false,false,true
listOfIntegers=1,2,3,4
listOfCharacters=a,b,c
Давайте создадим аналогичное свойство, но на этот раз мы будем использовать другой разделитель:
@Value("#{'${listOfBooleans}'.split(',')}")
private List<Boolean> listOfBooleans;
@Value("#{'${listOfIntegers}'.split(',')}")
private List<Integer> listOfIntegers;
@Value("#{'${listOfCharacters}'.split(',')}")
private List<Character> 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);
}
Поскольку мы 5. Внедрение других типов
Давайте посмотрим на следующие свойства:
~ ~~ Мы видим, что Spring поддерживает базовые типы «из коробки», поэтому нам не нужно выполнять какой-либо специальный разбор:
@Autowired
private Environment environment;
@Test
void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() {
String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class);
List<String> listOfStrings = (List<String>)environment.getProperty("arrayOfStrings", List.class);
assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}
Это поддерживается только через SpEL, поэтому мы можем’ t ввести массив таким же образом.
6. Чтение свойств программно
Чтобы прочитать свойства программно, нам сначала нужно получить экземпляр нашего объекта Environment: