Рубрики
Без рубрики

Введать карту из файла YAML с весной

Узнайте, как вводить карту из файла YAML в весенней загрузке.

Автор оригинала: baeldung.

1. Обзор

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

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

2. Файлы YAML в весенних рамках

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

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

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

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

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

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

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

Весенняя загрузка вывихив экстернализацию данных на следующий уровень, предоставив удобную аннотацию под названием @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

В этом примере мы постараемся составить карту применение в простую Карта<Стринг, Стринг>. Точно так же мы вводим конфиг детали как Карта<Стринг, Список>, и пользователи как Карта с Струнные ключи и объекты, относящиеся к определенному пользователю классу – Учетные данные – как значения .

Во-вторых, давайте создадим класс фасоли – СерверПредложение – инкапсулировать логику привязки наших свойств конфигурации к Карта секунда:

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

    private Map application;
    private Map> config;
    private Map users;

    // getters and setters

    public static class Credential {
    	
        private String username;
        private String password;
        
        // getters and setters
        
    }
}

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

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

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

@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.

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

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

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

5. Заключение

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

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