Профили Spring предусматривают возможность разделить части конфигурации вашего приложения и открывать доступ к ним только в определенных окружениях. Любой @Component, @Configuration или @ConfigurationProperties можно пометить аннотацией @Profile для ограничения при загрузке, как это показано в следующем примере:

Java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {
    // ...
}
Kotlin
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
@Configuration(proxyBeanMethods = false)
@Profile("production")
class ProductionConfiguration {
    // ...
}
Если бины с аннотацией @ConfigurationProperties регистрируются через аннотацию @EnableConfigurationProperties вместо автоматического сканирования, аннотация @Profile должна быть задана для класса, помеченного аннотацией @Configuration, который содержит аннотацию @EnableConfigurationProperties. В случае, если сканируются аннотации @ConfigurationProperties, аннотацию @Profile можно задать для самого класса, помеченного аннотацией @ConfigurationProperties.

Можно использовать свойство spring.profiles.active для Environment, чтобы задать то, какие профили будут являться активными. Свойство можно задать любым из способов, описанных ранее в этой главе. Например, можно включить его в состав файла application.properties, как показано в следующем примере:

Properties
spring.profiles.active=dev,hsqldb
Yaml
spring:
  profiles:
    active: "dev,hsqldb"

Вы также можете задать его в командной строке, используя следующий ключ: --spring.profiles.active=dev,hsqldb.

Если ни один профиль не будет активен, активируется профиль по умолчанию. Имя профиля по умолчанию – default, и его можно тонко настроить с помощью свойства spring.profiles.default для Environment, как показано в следующем примере:

Properties
spring.profiles.default=none
Yaml
spring:
  profiles:
    default: "none"

spring.profiles.active и spring.profiles.default можно использовать только в документах, не относящихся к профилю. Это значит, что их нельзя включить в связанные с конкретным профилем файлы или документы, активированные при помощи spring.config.activate.on-profile.

Например, конфигурация второго документа недопустима:

Properties
# this document is valid
spring.profiles.active=prod
#---
# this document is invalid
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
Yaml
# this document is valid
spring:
  profiles:
    active: "prod"
---
# this document is invalid
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    active: "metrics"

Добавление активных профилей

Свойство spring.profiles.active следует тем же правилам упорядочивания, что и другие свойства: Приоритет выше у той, которая имеет наибольший показатель PropertySource. Это означает, что можно задавать активные профили в application.properties, а затем заменять их с помощью ключа командной строки.

Иногда полезно иметь свойства, которые добавляют активные профили, а не заменяют их. Свойство spring.profiles.include можно использовать для добавления активных профилей поверх тех, которые активируются свойством spring.profiles.active. Точка входа SpringApplication также имеет Java API для установки дополнительных профилей. См. метод setAdditionalProfiles() в разделе, посвященном SpringApplication.

Например, если приложение выполняет со следующими свойствами, общий и локальный профили будут активированы, даже если оно выполняется с использованием ключа --spring.profiles.active:

Properties
spring.profiles.include[0]=common
spring.profiles.include[1]=local
Yaml
spring:
  profiles:
    include:
      - "common"
      - "local"
Как и spring.profiles.active, spring.profiles.include можно использовать только в документах, не относящихся к профилю. Это значит, что его нельзя включить в связанные с конкретным профилем файлы или документы, активированные при помощи spring.config.activate.on-profile.

Группы профилей

Иногда профили, которые определяются и используются в приложении, слишком мелкомодульные и становятся громоздкими в использовании. Например, могут быть профили proddb и prodmq, которые используются для независимой активации функций базы данных и обмена сообщениями.

Помогает в этом функция Spring Boot, которая позволяет определять группы профилей. Группа профилей позволяет определять логическое имя для связанной группы профилей.

Например, мы можем создать production группу, состоящую из наших профилей proddb и prodmq.

Properties
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
Yaml
spring:
  profiles:
    group:
      production:
      - "proddb"
      - "prodmq"

Теперь приложение можно запустить, используя --spring.profiles.active=production, чтобы активировать профили production, proddb и prodmq за один раз.

Программная установка профилей

Устанавливать активные профили можно программно, вызвав SpringApplication.setAdditionalProfiles(…​) до запуска приложения. Также можно активировать профили с помощью интерфейса ConfigurableEnvironment из Spring.

Связанные с конкретным профилем конфигурационные файлы

Связанные с конкретным профилем варианты как application.properties (или application.yml), так и файлов, на которые ссылаются через аннотацию @ConfigurationProperties, учитываются как файлы и загружаются.