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

Spring Boot пытается привести свойства внешнего приложения к нужному типу, когда он связывается с bean-компонентами @ConfigurationProperties. Если вам нужно преобразование пользовательских типов, вы можете предоставить bean-компонент ConversionService (с bean-компонентом с именем ConversionService) или редакторы пользовательских свойств (с помощью bean-компонента CustomEditorConfigurer) или пользовательские преобразователи (с определениями bean, аннотированными как @ConfigurationPropertiesBinding).

Поскольку этот bean-компонент запрашивается очень рано в течение жизненного цикла приложения, обязательно ограничьте зависимости, которые использует ваш ConversionService. Как правило, любая требуемая зависимость не может быть полностью инициализирована во время создания. Возможно, вы захотите переименовать свой пользовательский ConversionService, если он не требуется для принудительного использования ключей конфигурации и полагаться только на пользовательские преобразователи, имеющие квалификацию @ConfigurationPropertiesBinding.

Преобразование продолжительности

Spring Boot имеет специальную поддержку для выражения продолжительности. Если вы предоставляете свойство java.time.Duration, в свойствах приложения доступны следующие форматы:

  • Обычное long представление (с использованием миллисекунд в качестве единицы по умолчанию, если не был указан @DurationUnit)
  • Стандартный формат ISO-8601, используемый java.time.Duration
  • Более читаемый формат, в котором значение и единица измерения связаны (например, 10s означает 10 секунд)

Рассмотрим следующий пример:

@ConfigurationProperties("app.system")
public class AppSystemProperties {

    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);

    private Duration readTimeout = Duration.ofMillis(1000);

    public Duration getSessionTimeout() {
        return this.sessionTimeout;
    }

    public void setSessionTimeout(Duration sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

    public Duration getReadTimeout() {
        return this.readTimeout;
    }

    public void setReadTimeout(Duration readTimeout) {
        this.readTimeout = readTimeout;
    }

}

Чтобы указать время ожидания сеанса 30 секунд, 30, PT30S и 30s эквивалентны. Тайм-аут чтения 500ms может быть указан в любой из следующих форм: 500, PT0,5S и 500ms.

Вы также можете использовать любой из поддерживаемых модулей:

  • ns для наносекунд
  • us для микросекунд
  • ms для миллисекунд
  • s для секунд
  • m для минут
  • h для часов
  • d для дней

Единица по умолчанию составляет миллисекунды и может быть переопределена с помощью @DurationUnit, как показано в примере выше.

Если вы выполняете обновление с предыдущей версии, которая просто использует Long для выражения длительности, обязательно определите единицу измерения (используя @DurationUnit), если она не равна миллисекундам вместе с переключением на Duration. Это дает прозрачный путь обновления, поддерживая гораздо более богатый формат.

Преобразование размеров данных

Spring Framework имеет тип значения DataSize, который выражает размер в байтах. Если вы предоставляете свойство DataSize, в свойствах приложения доступны следующие форматы:

  • Обычное long представление (с использованием байтов в качестве единицы по умолчанию, если не указан @DataSizeUnit)
  • Более читаемый формат, в котором значение и единица измерения связаны (например, 10MB означает 10 мегабайт)

Рассмотрим следующий пример:

@ConfigurationProperties("app.io")
public class AppIoProperties {

    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize bufferSize = DataSize.ofMegabytes(2);

    private DataSize sizeThreshold = DataSize.ofBytes(512);

    public DataSize getBufferSize() {
        return this.bufferSize;
    }

    public void setBufferSize(DataSize bufferSize) {
        this.bufferSize = bufferSize;
    }

    public DataSize getSizeThreshold() {
        return this.sizeThreshold;
    }

    public void setSizeThreshold(DataSize sizeThreshold) {
        this.sizeThreshold = sizeThreshold;
    }

}

Чтобы указать размер буфера 10 мегабайт, 10 и 10MB эквивалентны. Порог размера 256 байтов может быть указан как 256 или 256B.

Вы также можете использовать любой из поддерживаемых модулей:

  • B для байт
  • KB для килобайт
  • MB для мегабайт
  • GB для гигабайт
  • TB для терабайт

Единицей по умолчанию является байты, и ее можно переопределить с помощью @DataSizeUnit, как показано в примере выше.

Если вы обновляете предыдущую версию, которая просто использует Long для выражения размера, убедитесь, что вы определили единицу измерения (используя @DataSizeUnit), если это не байты вместе с переключением на DataSize. Это дает прозрачный путь обновления, поддерживая гораздо более богатый формат.


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


Комментарии

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

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

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

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