Уяви, що тобі потрібно керувати різними параметрами твоєї системи для різних середовищ — наприклад, розробки (development), тестування (test) і продакшена (production). У світі Spring це легко реалізується за допомогою профілів конфігурації.
Навіщо це потрібно?
- Різні налаштування для середовищ. Наприклад, для розробки використовують локальну базу даних, а для продакшена — хмарну.
- Перемикання конфігурацій на льоту. Міняєш налаштування, не переписуючи код.
- Підвищення безпеки. Конфіденційні параметри для продакшена можна зберігати окремо.
Якби профілі не існували, ти, швидше за все, просто тримав би різні файли конфігурації для кожного середовища й вручну копіював потрібний перед стартом. Звучить не дуже весело, але Spring позбавляє нас від цієї рутини.
Як працюють профілі в Spring Boot?
У Spring Boot кожен профіль — це набір конфігурацій, які застосовуються тільки при його активації. Ключова ідея в тому, що ти можеш визначити різні налаштування для різних профілів, а Spring сам підбере потрібні конфігурації залежно від активного профілю.
Наприклад, якщо в тебе є профілі dev і prod, Spring може використовувати конфігурації одного з них залежно від того, який профіль активний.
Як задаються профілі?
У Spring Boot профілі можна вказати:
- У конфігураційних файлах.
- За допомогою параметрів командного рядка.
- Через змінні середовища.
Конфігурація профілів в Spring Boot
1. Використання application.properties і application.yml
Spring Boot використовує файли конфігурації для керування налаштуваннями застосунку. За замовчуванням це:
application.propertiesapplication.yml
Додатково ти можеш створювати файли для конкретних профілів. Наприклад:
application-dev.properties(або.yml) — налаштування для профілюdev.application-prod.properties(або.yml) — налаштування для профілюprod.
При запуску застосунку Spring автоматично вибере файл конфігурації, підходящий для активного профілю.
Приклад: application.yml
spring:
profiles:
active: dev
application-dev.yml
app:
name: "MyApp (Development)"
datasource:
url: "jdbc:h2:mem:devdb"
username: "dev_user"
password: "dev_password"
application-prod.yml
app:
name: "MyApp (Production)"
datasource:
url: "jdbc:mysql://prod.server:3306/proddb"
username: "prod_user"
password: "prod_password"
Коли активний профіль dev, Spring завантажить налаштування з файлу application-dev.yml. Якщо активний профіль prod, він візьме налаштування з application-prod.yml.
2. Перемикання профілів
Через application.properties
Якщо хочеш задати профіль за замовчуванням, просто додай його в файл application.properties:
spring.profiles.active=dev
Через командний рядок
Активувати профіль можна при запуску застосунку:
java -jar myapp.jar --spring.profiles.active=prod
Через змінні середовища
Можна задати профіль за допомогою змінної середовища:
export SPRING_PROFILES_ACTIVE=prod
3. Використання анотації @Profile
Spring також дозволяє керувати профілями на рівні компонентів. За допомогою анотації @Profile можна вказати, у якому профілі повинен створюватися той чи інший bean.
Приклад:
Код конфігурації:
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
// Налаштування для профілю dev
return new HikariDataSource();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
// Налаштування для профілю prod
return new HikariDataSource();
}
}
Тепер Spring створить bean DataSource залежно від активного профілю.
Практика: реалізація профілів у Spring Boot додатку
1. Налаштування проєкту
Створи новий проєкт на Spring Initializr. Додай потрібні залежності, такі як:
- Spring Boot Starter Web
- Spring Boot Starter Data JPA
- H2 Database
2. Додавання конфігураційних файлів
Створи три файли:
application.yml— основний файл конфігурації.application-dev.yml— налаштування для розробки.application-prod.yml— налаштування для продакшена.
application.yml
spring:
profiles:
active: dev
application-dev.yml
app:
name: MyApp (Dev)
server:
port: 8080
datasource:
url: jdbc:h2:mem:devdb
username: dev_user
password: password
application-prod.yml
app:
name: MyApp (Prod)
server:
port: 8081
datasource:
url: jdbc:mysql://prod.server:3306/proddb
username: prod_user
password: prod_password
3. Використання профілів у коді
Зробимо контролер, який повертає поточне ім'я застосунку.
AppController.java
@RestController
@RequestMapping("/api")
public class AppController {
@Value("${app.name}")
private String appName;
@GetMapping("/name")
public String getAppName() {
return appName; // Повертаємо ім'я застосунку, вказане в конфігурації
}
}
4. Запуск застосунку
5. Запусти додаток з профілем dev:
java -jar myapp.jar --spring.profiles.active=dev
Перейдіть за адресою http://localhost:8080/api/name. Побачиш:
MyApp (Dev)
6. Запусти додаток з профілем prod:
java -jar myapp.jar --spring.profiles.active=prod
Перейдіть за адресою http://localhost:8081/api/name. Результат:
MyApp (Prod)
Кращі практики: робота з профілями у великому проєкті
- Створюй мінімальні налаштування за замовчуванням. Наприклад, зберігай загальні параметри в
application.yml, а унікальні — у файлах для профілів. - Не зберігай паролі продакшена в коді. Для цього є секрети (наприклад HashiCorp Vault).
- Додай тестовий профіль. Це спростить тестування твого застосунку.
Приклад: application.yml
logging:
level: INFO
application-test.yml
logging:
level: DEBUG
datasource:
url: jdbc:h2:mem:testdb
Що робити, якщо щось пішло не так?
Часто початківці забувають активувати профіль. Це призводить до того, що Spring використовує конфігурацію за замовчуванням (application.yml). Щоб цього уникнути:
- Завжди встановлюй профіль вручну, використовуючи параметр
spring.profiles.active. - Перевіряй консольні логи — Spring завжди вказує, який профіль активний.
Ще одна проблема — перетин налаштувань. Якщо ти задав однакові параметри в різних файлах, Spring віддасть пріоритет активному профілю. Це легко забути, але, як знаєш, логування — твій кращий друг.
Офіційна документація Spring по профілям допоможе тобі поглибити знання.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ