Статьи

Конфигурация проекта с помощью Spring

Содержание

1. Обзор проблемы

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

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

В этом случае свойства будут представлять учетные данные базы данных и URI — например, мы хотим иметь возможность перейти к производственной базе данных в производственной среде и к базе данных в памяти для среды разработки . Другая конфигурация, связанная с персистентностью, может быть диалектом Hibernate в случае, если приложение использует Hibernate или диалект jpa для JPA — их на самом деле должно быть достаточно для полного переключения между поставщиками персистентности.

2. Файлы .properties

Учитывая следующие типы сред, которые мы хотим охватить — dev , staging , production — нам нужно будет создать следующие файлы свойств: persistence-dev.properties , persistence-staging.properties и persistence-production.properties . В типичном приложении Maven они могут находиться в src / main / resources , но где бы они ни находились, они должны быть доступны в пути к классам при развертывании приложения.

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

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

В Spring необходимо использовать правильный файл свойств в зависимости от среды:

<?xml version="1.0" encoding="UTF-8"?>02.<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
04.xmlns:context="http://www.springframework.org/schema/context"
05.xsi:schemaLocation="
06.<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans<;/a>
07.<a href="http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">http://www.springframework.org/schema/beans/spring-beans-3.1.xsd<;/a>
08.<a href="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context<;/a>
<a href="http://www.springframework.org/schema/context/spring-context-3.1.xsd" "="">http://www.springframework.org/schema/context/spring-context-3.1.xsd"</a>>
 
<context:property-placeholder location="
classpath*:*persistence-${envTarget}.properties" />

</beans>

Если используется Spring 3.1, эта конфигурация создаст
PropertySourcesPlaceholderConfigurer, который добавит свойства, определенные в файле, в абстракцию Spring Environment. Для более старых версий Spring будет создан более старый
PropertyPlaceholderConfigurer для работы со свойствами. Дополнительные сведения о недавно представленной
абстракции
среды и поддержке свойств см. В предыдущей
статье «
Свойства со Spring» .

Этот подход позволяет гибко иметь несколько файлов * .properties для конкретных целевых целей — свойства, связанные с постоянством, могут быть сгруппированы в их собственный файл постоянства — *. Properties , в то время как другие проблемы могут иметь свои собственные файлы .properties . Общие свойства, которые являются глобальными для приложения, но не меняются в зависимости от среды, могут быть просто добавлены в уникальный файл common.properties .

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

Последняя развертываемая война будет содержать все файлы свойств — для сохранения, три варианта сохранения — *. Properties . Так как файлы на самом деле называется по- разному, нет никакого страха случайно работает против неправильного — установив в envTarget переменного , мы будем сильно выбрать один экземпляр множество существующих вариантов.

EnvTarget переменная может быть установлена в OS / среде или в качестве параметра командной строки JVM:

-DenvTarget=dev

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

В некоторых интеграционных тестах необходимо включить постоянство, но, очевидно, это не тот же поставщик / схема, что и в стандартной среде. Гибкость текущего решения идеально подходит для этого варианта использования — Maven pom.xml должен просто указать переменную envTarget для тестирования:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
      <systemPropertyVariables>
         <persistenceTarget>h2_test</persistenceTarget>
      </systemPropertyVariables>
   </configuration>
</plugin>

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

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

Есть несколько способов улучшить это решение, если это необходимо. Один из таких способов — использовать более сложную кодировку для имен файлов свойств, указывая не только среду, в которой они должны использоваться, но и дополнительную информацию (например, поставщик сохраняемости).

Теперь имена файлов свойств должны быть следующими: persistence-h2.properties , persistence-mysql.properties или, еще более конкретно: persistence-dev_h2.properties , persistence-staging_mysql.properties , persistence-production_amazonRDS.properties .

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

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

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

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

Если вы читаете это далеко, вы должны
следовать за мной в твиттере здесь .