Рубрики
Без рубрики

Конфигурация проекта с пружиной

В этой статье рассматривается простое, но гибкое решение для настройки, специфичное для среды с Spring.

Автор оригинала: Eugen Paraschiv.

содержание

  • 1. Конфигурация Должна Быть Специфичной Для Конкретной Среды
  • 2. Файлы .properties для каждой среды
  • 3. Конфигурация Пружины
  • 4. Установка свойства в каждой среде
  • 5. Тестирование и Maven
  • 6. Идем Дальше
  • 7. Заключение

1. Конфигурация Должна Быть Специфичной Для Конкретной Среды

Конфигурация должна быть специфичной для окружающей среды – это просто факт жизни. Если бы это было не так, то это не было бы конфигурацией, и мы бы просто жестко закодировали значения в коде.

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

Одним из наиболее распространенных и простых решений является гибкое использование файлов свойств и поддержка свойств первого класса, предоставляемая Spring .

В качестве доказательства концепции для целей этой статьи мы рассмотрим один конкретный тип свойства – конфигурацию базы данных. Имеет смысл использовать один тип конфигурации базы данных для производства, другой для тестирования и еще один для среды разработки.

2. Файлы .properties для каждой среды

Давайте начнем наше доказательство концепции – с определения среды, на которую мы хотим нацелиться:

  • Разработка
  • Постановка
  • Производство

Далее – давайте создадим 3 файла свойств – по одному для каждой из этих сред:

  • Далее – давайте создадим 3 файла свойств – по одному для каждой из этих сред:
  • Далее – давайте создадим 3 файла свойств – по одному для каждой из этих сред:
  • Далее – давайте создадим 3 файла свойств – по одному для каждой из этих сред:

В типичном приложении Maven они могут находиться в src/main/resources , но где бы они ни находились , они должны быть доступны в пути к классам при развертывании приложения.

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

3. Конфигурация Пружины

Весной мы включим правильный файл в зависимости от среды:




      

То же самое, конечно, можно сделать и с конфигурацией Java:

@PropertySource({ "classpath:persistence-${envTarget:dev}.properties" })

Этот подход позволяет гибко использовать несколько файлов *.properties для конкретных, целенаправленных целей . Например, в нашем случае конфигурация persistence Spring импортирует свойства persistence, что имеет смысл. Конфигурация безопасности будет импортировать свойства, связанные с безопасностью, и так далее.

4. Установка свойства в каждой среде

Окончательная развертываемая война будет содержать все файлы свойств – для сохранения три варианта сохранения-*.свойства . Поскольку файлы на самом деле называются по-разному, нет никакого страха случайно включить неправильный. Мы установим целевую переменную env и, таким образом, выберем нужный экземпляр из множества существующих вариантов.

Переменная env Target может быть установлена в ОС/среде или в качестве параметра командной строки JVM:

-DenvTarget=dev

5. Тестирование и Maven

Для интеграционных тестов, для которых требуется включить сохраняемость, мы просто установим свойство envTarget в pom.xml:


   org.apache.maven.plugins
   maven-surefire-plugin
   
      
         h2_test
      
   

Соответствующий файл persistence-h2_test.properties можно поместить в src/test/resources , чтобы он использовался только для тестирования и не был излишне включен и развернут вместе с war во время выполнения.

6. Идем Дальше

Существует несколько способов обеспечить дополнительную гибкость в этом решении, если это необходимо.

Одним из таких способов является использование более сложной кодировки для имен файлов свойств, указывающей не только среду, в которой они должны использоваться, но и дополнительную информацию (например, поставщик сохраняемости). Например, мы могли бы использовать следующие типы свойств: persistence-h2.properties , persistence-mysql.properties или, еще более конкретно: persistence-dev_h2.properties , persistence-staging_mysql.properties , persistence-production_amazonRDS.properties .

Преимущество такого соглашения об именовании – и это просто соглашение , поскольку в общем подходе ничего не меняется – заключается в простой прозрачности. Теперь становится намного яснее, что делает конфигурация, только взглянув на имена:

  • persistence-dev_h2.properties : поставщик персистентности для среды dev представляет собой легкую базу данных H2 в памяти
  • persistence-staging_mysql.properties : поставщик персистентности для среды staging является экземпляром MySQL
  • persistence-production_amazon_rds.properties : поставщиком персистентности для среды production является Amazon RDS

7. Заключение

В этой статье рассматривается гибкое решение для настройки конкретной среды весной. Альтернативное решение с использованием профилей можно найти здесь .

Реализацию решения можно найти в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.