Spring Boot вміє самостійно налаштовувати твій застосунок, дивлячись на бібліотеки в проєкті. Це нагадує розумного помічника: побачив у проєкті бібліотеку для бази даних — відразу налаштував підключення.
Принцип простий: "Є бібліотека? Налаштуємо!" Spring Boot перевіряє, які бібліотеки є в classpath:
- Знайшов бібліотеку — застосував потрібні налаштування
- Не знайшов — пропустив і пішов далі
Робота автоконфігурації
Щоб зрозуміти роботу автоконфігурації, поглянемо на спрощений цикл:
- Сканування контексту застосунку.
На етапі запуску Spring Boot перевіряє всі залежності, вказані у твоєму
pom.xml(абоbuild.gradle), і зіставляє їх з заздалегідь визначеними умовами. - Застосування правил конфігурації.
Spring Boot використовує механізми, описані в анотаціях і класах, щоб увімкнути або вимкнути конфігурації.
- Перевизначення користувацьких налаштувань.
Якщо ти вказав якісь параметри в
application.propertiesабоapplication.yml, вони мають пріоритет над дефолтними налаштуваннями автоконфігурації.
Трохи технічних деталей
Автоконфігурація працює через анотацію @EnableAutoConfiguration (яка прихована в @SpringBootApplication). За лаштунками вона шукає класи з анотаціями @ConditionalOnClass, @ConditionalOnMissingBean і так далі. Ці анотації визначають, включати або не включати конфігурацію компонента на основі умов.
Приклад: Якщо в нас є бібліотека Hibernate в classpath, Spring Boot автоматично ввімкне підтримку JPA (Java Persistence API) і налаштує EntityManager.
Приклад: автоконфігурація Hibernate
Додамо в pom.xml залежність для роботи з базою даних:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Після цього Spring Boot автоматично:
- Налаштує
EntityManager. - Підключить DataSource.
- Налаштує транзакції.
Ця конфігурація з'явиться "із коробки", без жодного рядка нашого коду. Все, що нам потрібно зробити — описати сутності (наприклад, використовуючи @Entity).
Вимкнення автоконфігурації
Хоча автоконфігурація корисна, бувають випадки, коли вона заважає. Наприклад, ти хочеш керувати налаштуваннями бази даних вручну або використовувати специфічну конфігурацію. Для цього можна вимкнути конкретні елементи автоконфігурації.
Використовуємо анотацію @EnableAutoConfiguration з виключенням:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
Тепер Spring Boot не буде автоматично налаштовувати DataSource. Це корисно, якщо, наприклад, у тебе зовсім екзотична база даних.
Перевизначення автоконфігурації
Spring Boot пропонує розумні налаштування за замовчуванням, але іноді тобі потрібно щось складніше, ніж "vanilla config". Хочеш інший пул з'єднань для бази даних? Або особливі налаштування кешування? У тебе є два способи підкинути свої правила:
- Додати налаштування в
application.propertiesабоapplication.yml - Створити свої біні, які перекриють дефолтні
Spring Boot поважає твою думку — твої налаштування завжди мають пріоритет над автоконфігурацією. Приклад: налаштування DataSource через application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Приклад: перевизначення біну
Якщо автоконфігурація створює стандартний бін, ти можеш замінити його своїм:
@Bean
public DataSource dataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/mydb")
.username("root")
.password("secret")
.build();
}
У цьому випадку автоматично налаштований DataSource буде замінений твоїм.
Робота з анотацією @Conditional
Spring Boot використовує анотації з пакету org.springframework.boot.autoconfigure.condition, щоб гнучко керувати конфігурацією. Ось кілька їхніх різновидів:
@ConditionalOnClass— діє, якщо вказаний клас доступний у classpath.@ConditionalOnMissingBean— спрацьовує, якщо бін з таким самим типом відсутній.@ConditionalOnProperty— включається, якщо вказано властивість у конфігурації.
Приклад: @ConditionalOnProperty
Впровадимо умовну поведінку на основі конфігурації:
- В application.properties:
app.feature.enabled=true - В коді:
@Configuration
public class FeatureConfig {
@Bean
@ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true")
public MyFeature myFeature() {
return new MyFeature();
}
}
Якщо app.feature.enabled рівне true, бін MyFeature буде створений. Інакше — ні.
Деактивація автоконфігурації через spring.factories
А що робити, якщо автоконфігурація занадто настирлива (або просто не підходить) і ти хочеш взяти управління в свої руки? Spring Boot зберігає всі свої автонастройки у файлі spring.factories — це свого роду пульт керування автоконфігурацією.
Знаючи про цей механізм, ти можеш або створити власні правила автоконфігурації, або відключити наявні. Все як у реальному житті — хочеш керувати процесом, знайди пульт керування.
Приклад кастомного spring.factories:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyCustomAutoConfiguration
Типові помилки і як їх уникати
- Дублювання налаштувань.
Якщо вказати налаштування і в
application.properties, і в Java-коді, це може призвести до конфліктів. Краще вибрати один метод конфігурування. - Пропущені залежності.
Якщо потрібна бібліотека відсутня в classpath, автоконфігурація не спрацює. Часто помилки з'являються через забуті залежності в
pom.xml. - Випадкове вимкнення автоконфігурації.
Будь обережним з анотацією
@EnableAutoConfiguration(exclude = ...), щоб випадково не відключити надто багато.
Практичне застосування
Автоконфігурація допомагає швидко створювати прототипи застосунків, що корисно як на стадії розробки, так і на співбесідах. Наприклад, якщо просять за 15 хвилин зробити REST API, Spring Boot зробить це майже миттєво.
У реальній розробці автоконфігурація дозволяє скоротити час на налаштування, особливо для стандартних інтеграцій: бази даних, веб-серверів, логування, безпеки. Однак для складних проєктів важливо знати, як її налаштовувати і перевизначати.
Тепер ми готові не тільки використовувати магію Spring Boot, а й керувати нею!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ