Spring: вставка файла различных свойств в соответствии с профилем
Во-первых, некоторый контекст:
В настоящее время я работаю над проектом, в котором я использую структуру Spring в Google AppEngine (GAE) для получения некоторых данных из одной из служб Google. Для этого я использую средства Google OAuth. Для этого мне нужно использовать clientSecret
и clientId
, которые относятся к моему приложению. Поскольку это статические значения конфигурации, я использую Spring <util:properties>
(ссылка на документацию), чтобы вставить эти значения в соответствующие классы.
Конфигурация XML:
<util:properties id="googleProperties" location="WEB-INF/google.properties" />
Использование класса:
@Value("#{googleProperties['google.data.api.client.id']}")
private String clientId;
Мой вопрос:
Как оказалось, значения clientId
и clientSecret
должны быть разными для производства (при развертывании в App Engine) для разработки (на моей локальной машине). Чтобы решить эту проблему без постоянного изменения значений в файле свойств при развертывании, я искал конфигурацию Spring profiles
, которая позволила бы мне указать различные файлы свойств для производства и разработки. Хотя у меня есть идея, как профили Spring работают на основе в документации, я не совсем уверен, какое подходящее решение будет в этом конкретном ситуация.
Другими словами, как я могу вставлять разные файлы свойств на основе того, развертывается ли мое приложение локально или на GAE?
Ответы
Ответ 1
Несколько вариантов:
Системные переменные
Вы можете использовать префикс для управления свойствами, специфичными для среды, это можно сделать с помощью системных переменных:
<util:properties id="googleProperties"
location="WEB-INF/${ENV_SYSTEM:dev}/google.properties" />
В этом случае он всегда будет выглядеть:
<util:properties id="googleProperties"
location="WEB-INF/dev/google.properties" />
по умолчанию, если не установлена системная переменная ENV_SYSTEM
. Если он установлен на qa
, например, он будет автоматически выглядеть:
<util:properties id="googleProperties"
location="WEB-INF/qa/google.properties" />
Spring Профили
Другой подход заключается в создании специфического профиля beans. Например:
<beans profile="dev">
<util:properties id="googleProperties"
location="WEB-INF/google-dev.properties" />
</beans>
<beans profile="qa">
<util:properties id="googleProperties"
location="WEB-INF/google-qa.properties" />
</beans>
Соответствующий googleProperties
будет загружен в зависимости от набора профилей. Например, это загрузит WEB-INF/google-dev.properties
:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();
Ответ 2
Вы на правильном пути, в нашем приложении у нас одинаковый сценарий, и мы используем "профили" для управления свойствами. Мы используем два конфигурационных файла один для Production, а другой для тестирования с установленными профилями.