Содержание
- 1. Обзор проблемы
- 2. В .properties файлы
- 3. Пружинная конфигурация
- 4. Установка свойства в каждой среде
- 5. Maven и тестирование
- 6. Идем дальше
- 7. Заключение
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 .
Если вы читаете это далеко, вы должны
следовать за мной в твиттере здесь .