Рубрики
Без рубрики

Пружинные Профили

Как определить и использовать профили весной. 4 способа включения профилей и их приоритет. И реальный пример использования профилей.

Автор оригинала: 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")

До сих пор мы рассмотрели несколько способов активации профилей. Давайте теперь посмотрим, какой из них имеет приоритет над другим, и что произойдет, если мы используем более одного, от самого высокого до самого низкого приоритета:

  1. Параметр контекста в web.xml
  2. WebApplicationInitializer
  3. Параметр системы JVM
  4. Переменная окружения
  5. Профиль 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 .