Данное приложение предназначено для отработки возможностей которые предоставляет Spring в работе с переменными окружения и настройками окружения в одном приложении для разных задач.
Spring предолставляет два механизма работы с переменными среды в коде:
- через аннотацию @Value("${property}")
- через POJO и аннотацию @ConfigurationProperties("some.properties")
Перывый способ хорош в том случае когда переменных среды которые мы хотим использовать в коде не много.
Однако, в случае группировки большого количества информации, которую мы хотим притащить извне, гораздо лаконичнее будет смотреться второй вариант.
Оба варианта применены в коде:
- пример для первого: @Value("${property}")
- пример для второго: @ConfigurationProperties
Достаточно удобно иметь разные конфигурации запуска одного приложения для тестов отладки или каких то других целей.
Spring позволяет сделать это посредством подготовки конфигурационных файлов application.properties
В данном случае выбор расширения между .properties и .yaml остается на приверженность предпочтениям, и реализовать механизм можно в обоих случаях.
В данном проекте подготовлены 2 файла с небольшими различиями:
- название базы данных testdb и proddb
- значение переменной окружения которая подтянется на страницу входа при запуске
Существует достаточно много статей как устроен этот механизм, но с моей точки зрения практически везде опускаются базовые вещи, которые кажутся сами собой разумеющимися для уже освоивших инструмент. Если мы хотим что-то выучить нужно помнить главное правило: глупых вопросов не бывает.
В случае с конфигурацией application.properties: ранее существовал механизм обозначения группы настроек,
который прописывался внутри файла примерно слудующим образом spring.profiles.active=production
Сейчас при создании нового пректа эта настройка необязательна, так как теперь механизм реализован в связке с названием properties файла.
Например, название файла application-production.properties будет полностью анологично настройке описанной выше.
Какой файл учавствует в запуске и в каком случае?
По умолчанию подтянется файл без дополнительных конструкций. Чтобы изменить файл настроек нужно добавлять специальные команды при запуске.
Они будут различаться для разных сборщиков. В данном проекте использован Gradle, поэтому запуск с альтернативными настройками добавлен в отдельную задачу.
Ее можно найти в блоке gradle -> other -> test_run
Мы уже изменили переменные среды в разных настройках, у базы данных можно изменить достаточно много - изменить драйвер, подключиться к postgres вместо H2, уже звучит достаточно внушительно, но что еще можно сделать с этим инструментом?
Конфигурация среды позволяет также определять какие сущности будет создавать наше приложение.
В Spring мы можем использовать аннотацию @Profile("profile") над компонентом. В данном случае компонент будет инициализирован только в том случае,
если выбран профиль который указан в аннотации.
Для примера в данном приложении конфигурация Security для test_run отключает аутентификацию,
но в случае обычной загрузки применяется стандартная реализация аутентификации по логину user и паролю сгенерированну приложением в момент запуска.
Здесь же стоит упомянуть еще об одном механизме конфигурации бинов которые предоставляет Spring. Это аннотация: @ConditionalOnProperty(name = "my.property", havingValue = "value") - пример в коде. В отличие от профилей она работает более точечно, но для больших групп настроек потльзоваться ей будет не так удобно.
Настройка сборщика достаточно кропотливая часть, здесь собрана информация для
базовой конфигурации gradle и некоторых возможностях конфигурации проекта.