Весенние Профили

Весенние Профили

1. обзор

В этой статье мы сосредоточимся на представленииProfiles in Spring.

Профили - это ключевая особенность фреймворка, позволяющая нам сопоставлять наши bean-компоненты с разными профилями, напримерdev,test,prod.

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

Дальнейшее чтение:

Настройка отдельного источника данных Spring для тестов

Краткое практическое руководство по настройке отдельного источника данных для тестирования в приложении Spring.

Read more

Свойства с Spring и Spring Boot

Учебное пособие по работе с файлами свойств и значениями свойств в Spring.

Read more

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")

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

  1. Параметр контекста вweb.xml

  2. WebApplicationInitializer

  3. Системный параметр JVM

  4. Переменная среды

  5. 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, поэтому его должно быть легко импортировать и запускать как есть.