Статьи

Расширенный конфиг с метаданными конфигурации в Spring Bootstrap

После небольшого введения в метаданные конфигурации и изучения основ в моей предыдущей публикации под названием Pimp your config с метаданными конфигурации в Spring Boot , пришло время взглянуть на то, как продвинуться на этот шаг дальше и дополнительно настроить конфигурацию. , В этой статье я планирую представить устаревшее свойство конфигурации и обсудить различные поставщики значений, позволяющие использовать одну из самых удобных конфигураций приложений, которую я когда-либо испытывал (давно прошли времена опечаток в вашей конфигурации при попытке выписать полностью квалифицированное имя класса или путь к ресурсу — давайте порадуемся. 🙂

Амортизация имущества

Когда дело доходит до конфигурации, один верный способ вызвать проблему — это ввести внезапное и недокументированное критическое изменение, которое может вызвать сбой во время инициализации приложения или во время выполнения. В Spring Boot появилась возможность пометить и задокументировать свойство, которое не рекомендуется использовать, чтобы противостоять этому сценарию. Следуя духу простого объявления, как только у вас будет готово новое свойство (замена), все, что вам нужно сделать, это добавить JSON-узел deprecation в описание property в файле additional-spring-configuration-metadata.json :

Амортизация имущества

01
02
03
04
05
06
07
08
09
10
...
{
    "name": "my.property",
    "defaultValue": "something",
    "deprecation": {
        "replacement": "my.new-property",
        "reason": "This property is no longer needed."
    }
}
...

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

осуждается-свойство-список

В случае, если вы уже использовали устаревшее свойство где-то в файле свойств, все может стать немного странным в зависимости от используемой цветовой темы и IDE. Мне нравится использовать IDEA с темой Obsidian, что приводит к выделению следующего текста. Это можно было бы сделать лучше, но как только вы привыкнете к нему и поймете, что означает каждый цвет, проблем нет. Просто кое-что, чтобы иметь в виду.

осуждается-недвижимость

Вы также можете копнуть глубже и увидеть, почему это свойство было помечено как устаревшее. Просто вызовите документацию для этого свойства (нажав CTRL + Q по умолчанию в IDEA), и вы увидите нечто похожее на это окно, отображающее метаданные, которые я определил ранее, в файле additional-spring-configuration-metadata.json . Этот поиск работает для всех свойств, и он зависит от вашего кода и дополнительных метаданных конфигурации, насколько подробным и описательным он становится.

осуждается-свойство-документ

Наличие ссылки на свойство, которое должно заменить / заменить это свойство, особенно полезно. Это означает, что вы можете использовать намеренные действия (по умолчанию вызываемые нажатием ALT + ENTER в IDEA) и выполнять замену устаревшего свойства одним нажатием. Вы все сделали в случае, если значение свойства может остаться неизменным. В противном случае вам также необходимо обновить значение. Довольно аккуратно!

осуждается-свойство замены

Провайдеры стоимости

Поставщики значений доступны только для подсказок, предоставленных вручную (с использованием файла additional-spring-configuration-metadata.json ). Spring Boot определяет их как способ описания списка потенциальных значений для свойства, связывая провайдера для добавления четко определенной семантики к свойству, чтобы инструмент мог обнаружить список потенциальных значений на основе контекста проекта. Это может показаться немного расплывчатым, однако это действительно классная функция, позволяющая использовать практически любой аспект вашего проекта из иерархии классов, структуры ресурсов или собственного контекста Spring.

Ссылка на класс

Давайте начнем с чего-то действительно простого, но очень практичного — справочника классов. В случае, если я хочу настроить, какую стратегию следует использовать в моем приложении, в зависимости от того, где развернуто приложение, я мог бы реализовать несколько реализаций стратегии и создать свойство для захвата этой части конфигурации. Каждая из моих стратегий реализует единый интерфейс IStrategy . Предоставив простое объявление провайдера в разделе additional-spring-configuration-metadata.json файла additional-spring-configuration-metadata.json , я могу значительно упростить заполнение этого свойства.

Пример ссылки на класс

01
02
03
04
05
06
07
08
09
10
11
12
13
...
    {
        "name": "my.strategy",
        "providers": [
            {
                "name": "class-reference",
                "parameters": {
                    "target": "com.jakubstas.s3downloader.strategy.IStrategy"
                }
            }
        ]
    }
...

Как только вы обновите введенные вручную метаданные и перекомпилируете проект, свойство стратегии появится в списке доступных свойств. Здесь нет ничего нового.

класс справочно-список

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

Класс-ссылка недвижимость

Крутая вещь в этом заключается в том, что вам не нужно беспокоиться о предоставлении дополнительных описаний для каждого доступного класса, поскольку у вас все еще есть возможность использовать действие поиска документации (нажав CTRL + Q по умолчанию в IDEA). Это позволяет разработчикам просто просматривать доступные варианты и выбирать тот, который подходит лучше всего, очень удобно и без каких-либо потов.

Класс-ссылка Свойство подробно

Обрабатывать как

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

При этом мы можем захотеть использовать разные сведения об условиях и положениях в нашем приложении, а также иметь возможность переключаться между различными версиями каждой из них без необходимости выпускать ее целиком. Новое свойство было введено в мою конфигурацию для поддержки этого требования. Предоставив простое объявление провайдера в разделе hints файла Additional additional-spring-configuration-metadata.json как в этом фрагменте, я смогу просматривать только свои ресурсы и быстро переходить к файлу, который я хочу использовать.

Обрабатывать свойство как ресурс

01
02
03
04
05
06
07
08
09
10
11
12
13
...
    {
        "name": "my.terms-and-conditions",
        "providers": [
            {
                "name": "handle-as",
                "parameters": {
                    "target": "org.springframework.core.io.Resource"
                }
            }
        ]
    }
...

Первое, что вам предлагается, это выбор типа ресурса, который вы хотите использовать (да, он поддерживает префиксы строк ресурса :)).

Ресурс-недвижимость

Я хочу использовать ресурс classpath и перейти к своему файлу. Поскольку вы, возможно, захотите использовать саму папку в качестве ресурса, вам необходимо предоставить разделители файлов самостоятельно.

ресурс-свойство-нав

другие

Есть несколько других провайдеров ценности, которые стоит проверить, и я не буду обсуждать их на том же уровне детализации, что и предыдущие два. Давайте кратко рассмотрим, что еще мы можем использовать:

  • любой
    • Разрешить любое дополнительное значение, которое будет предоставлено.
  • имя логгера
    • Автозаполнение действительных имен регистратора. Как правило, имена пакетов и классов, доступные в текущем проекте, могут быть заполнены автоматически.
  • Ссылка на бобовые
    • Автозаполнение доступных имен компонентов в текущем проекте.
  • Название весеннего профиля
    • Выполните автоматическое заполнение доступных имен профилей Spring в проекте.

Для получения дополнительной информации, пожалуйста, обратитесь к Приложению B.

Вывод

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