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 .