16 февраля 2020
Тэги: Collections, Java, json, Spring, Spring Boot, XML, yaml.
Spring Boot позволяет хранить настройки приложения в файле и получать к ним доступ в декларативном стиле. Этот файл может иметь один из трёх форматов: properties, xml и yaml. Как Spring будет интерпретировать формат файла, определяется его расширением. Далее мы рассмотрим плюсы и минусы каждого формата. В качестве примера предположим, что в конфиге мы храним число, текстовую строку на русском языке и список значений.
По умолчанию в Spring используется properties-конфиг. Имя файла должно начинаться со слова application и иметь расширение properties. Если вы не используете профили для разделения конфигов, то достаточно иметь файл application.properties.
В данном формате комментарии всегда начинаются с новой строки и с символа «#». Имя каждого параметра прописывается полностью (и это один из недостатков данного формата), затем идёт «=», затем само значение. Текстовые значения можно указывать как в кавычках, так и без них. Список значений, который в нашем приложении превратится в объект типа List, в конце имени каждого значения имеет индекс в квадратных скобках. Такой синтаксис похож на объявление массива.
Настройки с общим префиксом (в нашем случае это «some.test») удобно группировать в одном конфигурационном бине. Для нашего примера этот бин выглядит так:
Аннотация @Component указывает на то, что это бин, управляемый Spring'ом. Аннотация @ConfigurationProperties позволяет задать общий префикс этих параметров. Имена полей этого бина соответствуют именам параметров в конфиге.
Если мы запустим приложение, то увидим, что все параметры подгрузились. Однако вместо текста на русском языке мы увидим иероглифы. Отсюда следует, что properties-файлы не поддерживают юникод. Но если вы будете хранить в конфиге тексты только на английском, то для вас это значения не имеет.
Xml-конфиг можно хранить в файле application.xml. Его достоинством является поддержка юникода. Заменим application.properties на application.xml следующего содержания:
Как видите, данный формат является стандартным xml, поэтому довольно многословен. Зато более универсален.
Каждый параметр представлен элементом entry. Имя параметра задаётся атрибутом key. Список значений именуется так же, как в properties-файле.
Бин MyProperties, который мы создали ранее, будет также успешно работать и с этим форматом. И строка текста на русском будет отображаться корректно.
Наконец, рассмотрим наиболее современный формат – yaml. Он лишён многословности xml и при этом поддерживает юникод. Заменим application.xml на application.yml следующего содержания:
Как видите, yaml наглядно демонстрирует иерархичность настроек. Часть имени параметра test является дочерней по отношению к some, поэтому располагается на другой строке и с отступом в два пробела. numberValue является дочерним по отношению к test и находится по отношению к нему с отступом в 2 пробела или в 4 пробела от начала строки.
Имя параметра всегда оканчивается двоеточием. Если на этой же строке располагается значение, то после двоеточия следует пробел, а затем само значение. Текстовые значения можно брать в кавычки. Комментарии могут располагаться в конце той же строки. Они начинаются с «#». Элементы списка всегда начинаются с тире, затем идёт пробел, затем само значение.
Таким образом, yaml наиболее компактный и наглядный формат. Единственным его недостатком можно считать необходимость знания правил форматирования вроде пробела после двоеточия и отступов из двух пробелов. Однако все современные IDE умеют работать с этим форматом и потому форматирование не является проблемой.
Формат | Плюсы | Минусы |
---|---|---|
properties | Предлагается по умолчанию. Прост в использовании. | Многословен. Не поддерживает юникод. |
xml | Поддерживает юникод. | Крайне многословен. |
yaml | Поддерживает юникод. Компактный и наглядный формат. | Требует знания правил форматирования. |
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.
05.04.2024 07:41 Дмитрий
У `properties` файла есть одна замечательная особенность: в нем можно задавать переменные окружения, которые в свою очередь будут использоваться в `yaml` файле.
Например при запуске сервиса локально, с профилем.