Весенние Профили
1. обзор
В этой статье мы сосредоточимся на представленииProfiles in Spring.
Профили - это ключевая особенность фреймворка, позволяющая нам сопоставлять наши bean-компоненты с разными профилями, напримерdev,test,prod.
Затем мы можем активировать разные профили в разных средах, чтобы загрузить только те компоненты, которые нам нужны:
Дальнейшее чтение:
Настройка отдельного источника данных Spring для тестов
Краткое практическое руководство по настройке отдельного источника данных для тестирования в приложении Spring.
Свойства с Spring и Spring Boot
Учебное пособие по работе с файлами свойств и значениями свойств в Spring.
2. Используйте@Profile на бине
Давайте начнем с простого и посмотрим, как сделать bean-компонент принадлежащим определенному профилю. Используя аннотацию@Profile, мы сопоставляем компонент с этим конкретным профилем; аннотация просто берет имена одного (или нескольких) профилей.
Рассмотрим базовый сценарий - у нас есть компонент, который должен быть активным только во время разработки, но не должен использоваться в производстве. Мы аннотируем этот bean-компонент профилем «dev», и он будет присутствовать в контейнере только во время разработки - в производственной средеdev просто не будет активным:
@Component
@Profile("dev")
public class DevDatasourceConfig
В качестве быстрого обозначения имена профилей также могут начинаться с оператора NOT, например «!dev», чтобы исключить их из профиля.
В приведенном ниже примере компонент активируется, только если профиль «dev» не активен:
@Component
@Profile("!dev")
public class DevDatasourceConfig
3. Объявить профили в XML
Профили также могут быть настроены в XML - тег<beans> имеет атрибут“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. Программно черезConfigurableEnvironment
Вы также можете установить профили непосредственно в среде:
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");
4.3. Параметр контекста вweb.xml
Точно так жеprofiles can be activated in the web.xml веб-приложения, используя параметр контекста:
contextConfigLocation
/WEB-INF/app-config.xml
spring.profiles.active
dev
4.4. Системный параметр JVM
Имена профилей также могут передаваться через системный параметр JVM. Имена профилей, переданные в качестве параметра, будут активированы при запуске приложения:
-Dspring.profiles.active=dev
4.5. Переменная среды
В среде Unixprofiles can also be activated via the environment variable:
export spring_profiles_active=dev
4.6. Maven Профиль
Профили Spring также можно активировать через профили Maven, указав свойство sconfigurationspring.profiles.active .
В каждом профиле Maven мы можем установить свойствоspring.profiles.active:
dev
true
dev
prod
prod
Его значение будет использоваться для замены заполнителя@[email protected] вapplication.properties:
[email protected]@
Теперь нам нужно включить фильтрацию ресурсов в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. Профиль по умолчанию
Любой компонент, который не указывает профиль, принадлежит профилю «default».
Spring также предоставляет способ установить профиль по умолчанию, когда никакой другой профиль не активен - с помощью свойства «spring.profiles.default».
6. Получить активные профили
Активные профили Spring определяют поведение аннотации@Profile для включения / отключения bean-компонентов. Однако мы также можем захотеть получить доступ к списку активных профилей программным способом.
У нас есть два способа сделать это:using Environment or*spring.active.profile*.
6.1. ИспользуяEnvironment
Мы можем получить доступ к активным профилям из объекта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;
Здесь наша переменнаяactiveProfilewill contain the name of the profile that is currently active,, и если их несколько, она будет содержать их имена, разделенные запятой.
Однако мы должныconsider what would happen if there is no active profile at all. С нашим кодом выше отсутствие активного профиля помешало бы созданию контекста приложения. Это приведет кIllegalArgumentException из-за отсутствия заполнителя для вставки в переменную.
Чтобы этого избежать, мы можемdefine a default value:
@Value("${spring.profiles.active:}")
private String activeProfile;
Теперь, если нет активных профилей, нашactiveProfile будет просто содержать пустую строку. И, если мы хотим получить доступ к их списку, как в предыдущем примере, мы можем сделать это с помощьюsplitting переменнойactiveProfile:
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 будет вводить bean-компонентDevDatasourceConfig илиProductionDatasourceConfig:
public class SpringProfilesWithMavenPropertiesIntegrationTest {
@Autowired
DatasourceConfig datasourceConfig;
public void setupDatasource() {
datasourceConfig.setup();
}
}
Когда активен профиль «dev», пружина вводит объектDevDatasourceConfig, и при вызове методаsetup() выводится следующий результат:
Setting up datasource for DEV environment.
8. Профили в Spring Boot
Spring Boot поддерживает всю описанную конфигурацию профиля с несколькими дополнительными функциями.
Параметр инициализацииspring.profiles.active, представленный в разделе 4, также может быть настроен как свойство в Spring Boot для определения текущих активных профилей. Это стандартное свойство, которое Spring Boot подберет автоматически:
spring.profiles.active=dev
Для программной установки профилей мы также можем использовать классSpringApplication:
SpringApplication.setAdditionalProfiles("dev");
Чтобы установить профили с помощью Maven в Spring Boot, мы можем указать имена профилей вspring-boot-maven-plugin вpom.xml:
org.springframework.boot
spring-boot-maven-plugin
dev
...
И выполнить конкретную цель Maven Spring Boot:
mvn spring-boot:run
Но самая важная функция Spring Boot, связанная с профилями, - этоprofile-specific properties files. Они должны быть названы в форматеapplications-{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. Заключение
В этом кратком руководстве мы обсудили, как использоватьdefine a profile в компоненте и как затем использоватьenable the right profiles в нашем приложении.
Наконец, мы подтвердили наше понимание профилей простым, но все же реальным примером.
Реализацию этого учебного пособия по Spring Security REST можно найти вthe GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.