Введіть масиви та списки з файлів властивостей Spring

1. Огляд

У цьому короткому навчальному посібнику ми дізнаємось, як вводити значення в масив або Список із файлу властивостей Spring.

2. Поведінка за замовчуванням

Ми почнемо з простого файлу application.properties :

arrayOfStrings=Baeldung,dot,com

Давайте подивимося, як веде себе Spring, коли ми встановлюємо для типу змінної String [] :

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

Ми бачимо, що Spring правильно вважає, що наш роздільник - це кома, і відповідно ініціалізує масив.

Також слід зазначити, що за замовчуванням введення масиву працює правильно лише тоді, коли у нас є значення, розділені комами.

3. Ін’єкційні списки

Якщо ми спробуємо ввести Список таким же чином, ми отримаємо дивовижний результат:

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

Наш Список містить один елемент, який дорівнює значенню, яке ми встановили у нашому файлі властивостей.

Для правильного введення Списку нам потрібно використовувати спеціальний синтаксис під назвою Spring Expression Language (SpEL):

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

Ми бачимо, що наш вираз починається з # замість $, який ми звикли з @Value .

Слід також зазначити, що ми використовуємо метод split , який робить вираз дещо складнішим, ніж звичайне введення.

Якщо ми хочемо зробити наш вираз дещо простішим, ми можемо оголосити своє майно у спеціальному форматі:

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

Весна розпізнає цей формат, і ми зможемо вводити наш Список, використовуючи дещо простіший вираз:

@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); }

Це підтримується лише через SpEL, тому ми не можемо вводити масив однаково.

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); assertEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }

7. Висновок

У цьому короткому посібнику ми дізналися, як легко вводити масиви та Списки на швидких та практичних прикладах.

Як завжди, код доступний на GitHub.