Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом уроке мы сосредоточимся на введении профилей весной.
Профили являются основной функцией фреймворка — позволяют нам сопоставлять наши компоненты с различными профилями — например, dev , test и prod .
Затем мы можем активировать различные профили в разных средах, чтобы загрузить только те компоненты, которые нам нужны.
Дальнейшее чтение:
Настройка отдельного источника данных Spring для тестов
Свойства с пружиной и пружинным загрузчиком
2. Используйте @Profile на бобе
Давайте начнем с простого и посмотрим, как мы можем сделать так, чтобы боб принадлежал к определенному профилю. Мы используем аннотацию @Profile — мы сопоставляем боб с этим конкретным профилем ; аннотация просто берет имена одного (или нескольких) профилей.
Рассмотрим базовый сценарий: у нас есть компонент, который должен быть активен только во время разработки, но не развернут в производстве.
Мы аннотируем этот компонент профилем dev , и он будет присутствовать только в контейнере во время разработки. В производстве разработка просто не будет активна:
@Component @Profile("dev") public class DevDatasourceConfig
В качестве краткого примечания имена профилей также могут быть снабжены префиксом оператора NOT, например, ! dev , чтобы исключить их из профиля.
В примере компонент активируется только в том случае, если dev профиль не активен:
@Component @Profile("!dev") public class DevDatasourceConfig
3. Объявите профили в XML
Профили также могут быть настроены в формате XML. Тег имеет атрибут profiles , который принимает значения соответствующих профилей, разделенные запятыми:
4. Установите профили
Следующим шагом является активация и настройка профилей таким образом, чтобы соответствующие компоненты были зарегистрированы в контейнере.
Это можно сделать различными способами, которые мы рассмотрим в следующих разделах.
4.1. Программно через интерфейс WebApplicationInitializer
В веб-приложениях WebApplicationInitializer может использоваться для настройки ServletContext программно.
Это также очень удобное место для установки наших активных профилей программно:
@Configuration public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.setInitParameter( "spring.profiles.active", "dev"); } }
4.2. Программно через Настраиваемую среду
Мы также можем устанавливать профили непосредственно в среде:
@Autowired private ConfigurableEnvironment env; ... env.setActiveProfiles("someProfile");
4.3. Параметр контекста в web.xml
Аналогично, мы можем определить активные профили в web.xml файл веб – приложения, использующий параметр контекста:
contextConfigLocation /WEB-INF/app-config.xml spring.profiles.active dev
4.4. Параметр системы JVM
Имена профилей также могут быть переданы через системный параметр JVM. Эти профили будут активированы во время запуска приложения:
-Dspring.profiles.active=dev
4.5. Переменная окружения
В среде Unix профили также могут быть активированы с помощью переменной окружения :
export spring_profiles_active=dev
4.6. Профиль Maven
Профили пружин также можно активировать с помощью профилей Maven, указав свойство spring.profiles.active configuration|/.
В каждом профиле Maven мы можем установить свойство spring.profiles.active :
dev true dev prod prod
Его значение будет использовано для замены @ [электронная почта защищена] заполнитель в заполнитель в :
Теперь нам нужно включить фильтрацию ресурсов в pom.xml :
... src/main/resources true
и добавьте параметр -P , чтобы переключить, какой профиль Maven будет применен:
mvn clean package -Pprod
Эта команда упакует приложение для prod профиля. Он также применяет spring.profiles.active value prod для этого приложения, когда оно запущено.
4.7. @ActiveProfile в тестах
Тесты позволяют очень легко указать, какие профили активны, используя аннотацию @ActiveProfile для включения определенных профилей:
@ActiveProfiles("dev")
До сих пор мы рассмотрели несколько способов активации профилей. Давайте теперь посмотрим, какой из них имеет приоритет над другим, и что произойдет, если мы используем более одного, от самого высокого до самого низкого приоритета:
- Параметр контекста в web.xml
- WebApplicationInitializer
- Параметр системы JVM
- Переменная окружения
- Профиль Maven
5. Профиль по Умолчанию
Любой компонент, который не указывает профиль, принадлежит профилю по умолчанию .
Spring также предоставляет способ установки профиля по умолчанию, когда ни один другой профиль не активен — с помощью свойства spring.profiles.default .
6. Получите Активные профили
Активные профили Spring управляют поведением аннотации @Profile для включения/выключения компонентов. Однако мы также можем захотеть получить доступ к списку активных профилей программно.
У нас есть два способа сделать это: используя Среду или spring.active.profile .
6.1. Использование среды
Мы можем получить доступ к активным профилям из объекта Environment , введя его:
public class ProfileManager { @Autowired private Environment environment; public void getActiveProfiles() { for (String profileName : environment.getActiveProfiles()) { System.out.println("Currently active profile - " + profileName); } } }
6.2. Использование spring.active.profile
В качестве альтернативы мы могли бы получить доступ к профилям, введя свойство spring.profiles.active :
@Value("${spring.profiles.active}") private String activeProfile;
Здесь ваш активный профиль переменная будет содержать имя профиля , который в данный момент активен , и если их несколько, он будет содержать их имена, разделенные запятой.
Однако мы должны рассмотреть, что произойдет, если активного профиля вообще не будет. В приведенном выше коде отсутствие активного профиля предотвратит создание контекста приложения. Это приведет к исключению IllegalArgumentException из-за отсутствия заполнителя для ввода в переменную.
Чтобы избежать этого, мы можем определить значение по умолчанию :
@Value("${spring.profiles.active:}") private String activeProfile;
Теперь, если никакие профили не активны, наш активный профиль будет просто содержать пустую строку.
И если мы хотим получить доступ к их списку, как и в предыдущем примере, мы можем сделать это, разделив переменную active Profile :
public class ProfileManager { @Value("${spring.profiles.active:}") private String activeProfiles; public String getActiveProfiles() { for (String profileName : activeProfiles.split(",")) { System.out.println("Currently active profile - " + profileName); } } }
7. Пример: Отдельные Конфигурации Источников Данных С Использованием Профилей
Теперь, когда с основами покончено, давайте рассмотрим реальный пример.
Рассмотрим сценарий, в котором мы должны поддерживать конфигурацию источника данных как для среды разработки, так и для производственной среды .
Давайте создадим общий интерфейс DatasourceConfig , который должен быть реализован обеими реализациями источника данных:
public interface DatasourceConfig { public void setup(); }
Ниже приведена конфигурация среды разработки:
@Component @Profile("dev") public class DevDatasourceConfig implements DatasourceConfig { @Override public void setup() { System.out.println("Setting up datasource for DEV environment. "); } }
И конфигурация для производственной среды:
@Component @Profile("production") public class ProductionDatasourceConfig implements DatasourceConfig { @Override public void setup() { System.out.println("Setting up datasource for PRODUCTION environment. "); } }
Теперь давайте создадим тест и введем наш интерфейс DatasourceConfig; в зависимости от активного профиля Spring введет DevDatasourceConfig или ProductionDatasourceConfig bean:
public class SpringProfilesWithMavenPropertiesIntegrationTest { @Autowired DatasourceConfig datasourceConfig; public void setupDatasource() { datasourceConfig.setup(); } }
Когда профиль dev активен, Spring вводит Dev Datasource Config объект, а при вызове метода setup() выводится следующее:
Setting up datasource for DEV environment.
8. Профили в весенней загрузке
Spring Boot поддерживает всю конфигурацию профиля, описанную до сих пор, с несколькими дополнительными функциями.
Параметр инициализации spring.profiles.active , представленный в разделе 4, также может быть настроен в качестве свойства в Spring Boot для определения текущих активных профилей. Это стандартное свойство, которое Spring Boot подберет автоматически:
spring.profiles.active=dev
Для установки профилей программно мы также можем использовать класс Spring Application :
SpringApplication.setAdditionalProfiles("dev");
Чтобы установить профили с помощью Maven в Spring Boot, мы можем указать имена профилей в разделе spring-boot-maven-plugin in pom.xm l :
... org.springframework.boot spring-boot-maven-plugin dev
и выполните конкретную для весенней загрузки цель Maven:
mvn spring-boot:run
Но самая важная функция, связанная с профилями, которую приносит Spring Boot, – это файлы свойств, специфичные для профиля. Они должны быть названы в формате application-{profile}.properties .
Spring Boot автоматически загрузит свойства в файл application.properties для всех профилей, а также свойства в файлах .properties только для указанного профиля.
Например, мы можем настроить различные источники данных для профилей dev и production , используя два файла с именами application-dev.properties и application-production.properties :
В файле application-production.properties мы можем настроить источник данных MySQL :
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db spring.datasource.username=root spring.datasource.password=root
Затем мы можем настроить те же свойства для профиля dev в файле application-dev.properties , чтобы использовать базу данных в памяти H2 :
spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=sa
Таким образом, мы можем легко обеспечить различные конфигурации для различных сред.
9. Заключение
В этой статье мы обсудили, как определить профиль на бобе и как затем включить правильные профили в нашем приложении.
Наконец, мы подтвердили наше понимание профилей с помощью простого, но реального примера.
Реализацию этого учебника можно найти в проекте GitHub .