Перейти к основному содержимому

Внедрить карту из файла YAML с помощью Spring

· 4 мин. чтения

1. Обзор

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

Во-первых, мы начнем с небольшого понимания файлов YAML в Spring Framework. Затем мы продемонстрируем на практическом примере, как связать свойства YAML с Map .

2. Файлы YAML в Spring Framework

Использование файлов YAML для хранения внешних данных конфигурации является обычной практикой среди разработчиков Spring. По сути, Spring поддерживает документы YAML в качестве альтернативы свойствам и использует SnakeYAML под капотом для их разбора .

Без лишних слов давайте посмотрим, как выглядит типичный файл YAML:

server:
port: 8090
application:
name: myapplication
url: http://myapplication.com

Как мы видим, файл YAML говорит сам за себя и более удобочитаем. На самом деле YAML предоставляет изящный и лаконичный способ хранения иерархических данных конфигурации.

По умолчанию Spring Boot считывает свойства конфигурации из application.properties или application.yml при запуске приложения. Однако мы можем использовать @PropertySource для загрузки пользовательского файла YAML .

Теперь, когда мы знакомы с тем, что такое файл YAML, давайте посмотрим, как внедрить свойства YAML в качестве карты в Spring Boot.

3. Как внедрить карту из файла YAML

Spring Boot вывел экстернализацию данных на новый уровень, предоставив удобную аннотацию под названием @ConfigurationProperties. Эта аннотация введена , чтобы легко внедрять внешние свойства из файлов конфигурации непосредственно в объекты Java .

В этом разделе мы подробно рассмотрим, как привязать свойства YAML к классу компонента с помощью аннотации @ConfigurationProperties .

Во-первых, давайте определим некоторые свойства ключ-значение в application.yml :

server:
application:
name: InjectMapFromYAML
url: http://injectmapfromyaml.dev
description: How To Inject a map from a YAML File in Spring Boot
config:
ips:
- 10.10.10.10
- 10.10.10.11
- 10.10.10.12
- 10.10.10.13
filesystem:
- /dev/root
- /dev/md2
- /dev/md4
users:
root:
username: root
password: rootpass
guest:
username: guest
password: guestpass

В этом примере мы попробуем сопоставить приложение с простой Map<String, String>. Точно так же мы введем сведения о конфигурации в виде Map<String, List<String>>, а пользователей — в виде Map со строковыми ключами и объектами, принадлежащими определенному пользователем классу — Credential — в качестве значений .

Во-вторых, давайте создадим класс bean-компонента — ServerProperties — для инкапсуляции логики привязки наших свойств конфигурации к Map s:

@Component
@ConfigurationProperties(prefix = "server")
public class ServerProperties {

private Map<String, String> application;
private Map<String, List<String>> config;
private Map<String, Credential> users;

// getters and setters

public static class Credential {

private String username;
private String password;

// getters and setters

}
}

Как мы видим, мы украсили класс ServerProperties @ConfigurationProperties. Таким образом, мы говорим Spring сопоставить все свойства с указанным префиксом с объектом ServerProperties .

Напомним, что наше приложение также должно быть включено для свойств конфигурации , хотя это делается автоматически в большинстве приложений Spring Boot .

Наконец, давайте проверим, правильно ли наши свойства YAML вводятся как Map s:

@RunWith(SpringRunner.class)
@SpringBootTest
class MapFromYamlIntegrationTest {

@Autowired
private ServerProperties serverProperties;

@Test
public void whenYamlFileProvidedThenInjectSimpleMap() {
assertThat(serverProperties.getApplication())
.containsOnlyKeys("name", "url", "description");

assertThat(serverProperties.getApplication()
.get("name")).isEqualTo("InjectMapFromYAML");
}

@Test
public void whenYamlFileProvidedThenInjectComplexMap() {
assertThat(serverProperties.getConfig()).hasSize(2);

assertThat(serverProperties.getConfig()
.get("ips")
.get(0)).isEqualTo("10.10.10.10");

assertThat(serverProperties.getUsers()
.get("root")
.getUsername()).isEqualTo("root");
}

}

4. @ConfigurationProperties против @Value

Теперь давайте быстро сравним @ConfigurationProperties и @Value.

Несмотря на то, что обе аннотации можно использовать для инжекта свойств из конфигурационных файлов , они достаточно разные. Основное различие между этими двумя аннотациями заключается в том, что каждая из них служит разным целям.

Короче говоря, значение @V `` позволяет нам напрямую вводить конкретное значение свойства по его ключу. Однако аннотация @ConfigurationProperties связывает несколько свойств с конкретным объектом и обеспечивает доступ к свойствам через сопоставленный объект.

В общем, Spring рекомендует использовать @ConfigurationProperties вместо @Value, когда дело доходит до внедрения данных конфигурации . @ConfigurationProperties предлагает отличный способ централизовать и сгруппировать свойства конфигурации в структурированном объекте, который мы можем позже внедрить в другие компоненты.

5. Вывод

Подводя итог, мы сначала объяснили, как внедрить карту из файла YAML в Spring Boot. Затем мы выделили разницу между @ConfigurationProperties и @Value.

Как обычно, полный исходный код статьи доступен на GitHub .