Spring Boot: конфигурация, слияние сложных типов свойств

Когда списки настроены более чем в одном месте, переопределение работает путем замены всего списка.

Например, предположим, что объект MyPojo с атрибутами name и description по умолчанию равен null. В следующем примере представлен список объектов MyPojo из AcmeProperties:

@ConfigurationProperties("acme")
public class AcmeProperties {

    private final List list = new ArrayList<>();

    public List getList() {
        return this.list;
    }

}

Рассмотрим следующую конфигурацию:

acme:
  list:
    - name: my name
      description: my description
---
spring:
  profiles: dev
acme:
  list:
    - name: my another name

Если профиль dev не активен, AcmeProperties.list содержит одну запись MyPojo, как определено ранее. Если профиль dev включен, однако, список все еще содержит только одну запись (с name = my another name и description = null). Эта конфигурация не добавляет второй экземпляр MyPojo в список и не объединяет элементы.

Когда список указан в нескольких профилях, используется тот, который имеет самый высокий приоритет (и только один). Рассмотрим следующий пример:

acme:
  list:
    - name: my name
      description: my description
    - name: another name
      description: another description
---
spring:
  profiles: dev
acme:
  list:
    - name: my another name

В предыдущем примере, если активен профиль dev, AcmeProperties.list содержит одну запись MyPojo (с name = my another name и description = null). Для YAML можно использовать как разделенные запятыми списки, так и списки YAML для полного переопределения содержимого списка.

Для свойств карты вы можете связать значения свойств, взятые из нескольких источников. Однако для одного и того же свойства в нескольких источниках используется тот, который имеет наивысший приоритет. В следующем примере предоставляется Map<String, MyPojo> из AcmeProperties:

@ConfigurationProperties("acme")
public class AcmeProperties {

    private final Map map = new HashMap<>();

    public Map getMap() {
        return this.map;
    }

}

Рассмотрим следующую конфигурацию:

acme:
  map:
    key1:
      name: my name 1
      description: my description 1
---
spring:
  profiles: dev
acme:
  map:
    key1:
      name: dev name 1
    key2:
      name: dev name 2
      description: dev description 2

Если профиль dev не активен, AcmeProperties.map содержит одну запись с ключом key1 (с name = my name 1 и description = my description 1). Если профиль dev включен, однако, карта содержит две записи с ключами key1 (с name = dev name 1 и description = my description 1) и key2 (с name = dev name 2 и description = dev description 2).

Предыдущие правила слияния применяются к свойствам из всех источников свойств, а не только к файлам YAML.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки