Что такое profiles in Spring?
Профили vs Feature Flags: если нужно включать/выключать функциональность в production БЕЗ перезапуска — используйте Feature Flags (Unleash, LaunchDarkly). Если разная инфраструк...
🟢 Junior Level
Profiles — способ использовать разные настройки для разных окружений (dev, test, prod).
# application.yaml (общие настройки)
server.port: 8080
# application-dev.yaml (для разработки)
spring.datasource.url: jdbc:h2:mem:dev
# application-prod.yaml (для продакшена)
spring.datasource.url: jdbc:postgresql://prod-db:5432/mydb
Активация:
java -jar app.jar --spring.profiles.active=prod
🟡 Middle Level
Способы активации
# 1. Командная строка
--spring.profiles.active=prod
# 2. Переменная окружения
SPRING_PROFILES_ACTIVE=prod
# 3. JVM параметр
-Dspring.profiles.active=prod
# 4. В тестах
@ActiveProfiles("test")
@Profile на бинах
@Bean
@Profile("dev")
public DataSource devDataSource() { ... }
@Bean
@Profile("prod")
public DataSource prodDataSource() { ... }
Логические выражения
@Profile("prod & !cloud") // Prod, но не в облаке
// Spring 5.1+ поддерживает логические операторы в @Profile: &, |, !
@Profile("dev | test") // Dev или test
@Profile("prod & (mysql | postgres)") // Сложные условия
🔴 Senior Level
Profile Groups
spring:
profiles:
group:
"highload": "cache, async, metrics"
# Активация highload → включает cache, async, metrics
Profile-specific Imports (Boot 2.4+)
# application.yaml
server.port: 8080
---
spring.config.activate.on-profile: dev
server.port: 9090
---
spring.config.activate.on-profile: prod
server.port: 80
Profiles vs Feature Flags
Profiles:
→ Инфраструктура (БД, очереди)
→ Требует перезапуска
Feature Flags:
→ Бизнес-логика
→ Меняются на лету
→ Не путайте!
Профили vs Feature Flags: если нужно включать/выключать функциональность в production БЕЗ перезапуска — используйте Feature Flags (Unleash, LaunchDarkly). Если разная инфраструктура для dev/test/prod — Profiles.
Cloud-Native
Kubernetes ConfigMaps → заменяют профили
Spring Cloud Config → внешний сервер конфигов
HashiCorp Vault → секреты
Профили → мостик к внешним конфигам
Production Experience
Реальный сценарий: забыли активировать prod
Приложение стартовало с default профилем
→ Подключилось к dev БД!
→ Потеря данных!
Решение:
→ Требовать профиль через validation
→ ConfigMaps в K8s
Диагностика
# Активные профили:
/actuator/env → activeProfiles
# Лог при старте:
"The following 1 profile is active: prod"
# Программно:
@Autowired Environment env;
env.getActiveProfiles();
Best Practices
- Не храните секреты в application.yaml
- Требуйте профиль для prod → validation
- Profile Groups → группировка
- Feature Flags → для бизнес-логики
- Cloud Config → внешнее управление
- @ActiveProfiles → для тестов
Резюме для Senior
- Profiles → разная конфигурация для окружений
- Приоритет источников (от высшего к низшему): CLI аргументы > JVM -D параметры > переменные окружения > application-{profile}.properties > application.properties
- Groups → объединение профилей
- Profile vs Feature Flags → инфраструктура vs бизнес
- Cloud-Native → ConfigMaps, Vault
- Validation → требуйте профиль для prod
🎯 Шпаргалка для интервью
Обязательно знать:
- Profiles — механизм разной конфигурации для окружений (dev, test, prod)
- Активация: –spring.profiles.active, SPRING_PROFILES_ACTIVE, JVM -D, @ActiveProfiles в тестах
- @Profile на @Bean методах и классах — бин создаётся только при активном профиле
-
Логические выражения в @Profile (Spring 5.1+): “prod & !cloud”, “dev test” - Profile Groups (Spring Boot 2.4+): один профиль активирует группу — spring.profiles.group
- Multi-document YAML: несколько профилей в одном файле через spring.config.activate.on-profile
- Profiles ≠ Feature Flags: профили — инфраструктура (перезапуск), флаги — бизнес-логика (на лету)
Частые уточняющие вопросы:
- Как активировать несколько профилей? — Через запятую: –spring.profiles.active=prod,cache,async.
- Что будет, если не активировать ни один профиль? — Используются только application.yaml (дефолтные настройки) — опасно для prod.
- Чем Profiles отличаются от Feature Flags? — Profiles требуют перезапуска и меняют инфраструктуру; Feature Flags переключают бизнес-логику на лету.
- Как гарантировать запуск только с нужным профилилем? — Validation: проверить env.getActiveProfiles() при старте и выбросить ошибку, если prod без профиля.
Красные флаги (НЕ говорить):
- «Профили можно менять без перезапуска» — нет, активация только при старте.
- «Feature Flags — это то же самое, что Profiles» — нет, флаги меняют бизнес-логику на лету.
- «Секреты можно хранить в application-prod.yaml» — нет, используйте Vault, K8s Secrets, CI/CD variables.
- «Profile groups заменяют отдельные профили» — нет, groups — это алиас для набора профилей.
Связанные темы:
- [[22. Что такое starter в Spring Boot]]
- [[21. Как работает @SpringBootApplication]]
- [[24. Что такое @Configuration класс]]
- [[27. Что делать, если есть несколько бинов одного типа]]