Що таке автоконфігурація в Spring Boot?
4. --debug → налагодження конфігурації 5. Порядок → After/Before анотації 6. Boot 3.x → новий формат .imports
🟢 Junior Level
Автоконфігурація — Spring Boot сам налаштовує біни, дивлячись на те, що є в classpath.
Проста аналогія: Розумний дім. Ви заходите в кімнату — світло вмикається саме. Вам не потрібно натискати вимикач.
// Без Spring Boot:
@Bean
public DataSource dataSource() {
// Ручне налаштування...
}
// З Spring Boot:
// Просто додайте залежність в pom.xml:
// <dependency>spring-boot-starter-data-jpa</dependency>
// → DataSource створиться автоматично!
Як вимкнути:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
🟡 Middle Level
Як працює
@SpringBootApplication
→ @EnableAutoConfiguration
→ AutoConfigurationImportSelector
→ Читає spring.factories (Boot 2.x)
→ або .imports (Boot 3.x)
→ Завантажує автоконфігурації
@Conditional анотації
@ConditionalOnClass(DataSource.class) // Якщо є клас
@ConditionalOnMissingBean // Якщо немає такого біна
@ConditionalOnProperty("app.enabled") // Якщо властивість true
@ConditionalOnWebApplication // Якщо web додаток
Приклад автоконфігурації
@Configuration
@ConditionalOnClass(ObjectMapper.class) // Якщо є Jackson
@ConditionalOnMissingBean(ObjectMapper.class) // Якщо ви не створили свій
public class JacksonAutoConfiguration {
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper(); // Створює дефолтний
}
}
Налагодження
# Запуск зі звітом:
java -jar app.jar --debug
# Вивід: Condition Evaluation Report
# → Показує, чому кожен бін створився чи ні
🔴 Senior Level
Spring Boot 2.x vs 3.x
Boot 2.x:
→ META-INF/spring.factories
→ Ключ: EnableAutoConfiguration
→ Ці файли містять список класів автоконфігурації (повні імена класів), по одному на рядок. Spring Boot читає їх при старті та реєструє вказані біни.
Boot 3.x:
→ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
→ Просто список класів
→ Швидше, підтримка GraalVM Native
Порядок завантаження
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@AutoConfigureBefore(HibernateJpaAutoConfiguration.class)
public class MyAutoConfiguration { }
// → Критично для залежностей між конфігураціями!
Створення своєї автоконфігурації
// В окремому модулі: mylib-autoconfigure
@AutoConfiguration
@ConditionalOnClass(MyService.class)
public class MyLibAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService();
}
}
// В META-INF/spring/...AutoConfiguration.imports:
com.example.MyLibAutoConfiguration
Production Experience
Реальний сценарій: повільний старт
Велика кількість автоконфігурацій збільшує час старту.
Виключення непотрібних через exclude та обмеження сканування пакетів може скоротити старт на 20-40%.
Best Practices
- @ConditionalOnMissingBean → дозволяйте перевизначати
- @AutoConfiguration (Spring Boot 2.7+: заміна @Configuration для автоконфігурації. Для Boot 3.x використовуйте
.importsфайл, для Boot 2.x —spring.factories). - exclude → вимикайте непотрібні
- –debug → налагодження конфігурації
- Порядок → After/Before анотації
- Boot 3.x → новий формат .imports
Резюме для Senior
- Автоконфігурація = Convention over Configuration
- @Conditional → перевірка умов
- Boot 3.x → .imports замість spring.factories
- Порядок → критичний для залежностей
- Своя автоконфігурація → окремий модуль
- –debug → Condition Evaluation Report
🎯 Шпаргалка для інтерв’ю
Обов’язково знати:
- Автоконфігурація = Convention over Configuration: Spring Boot сам налаштовує біни по classpath
- @SpringBootApplication → @EnableAutoConfiguration → AutoConfigurationImportSelector
- Boot 2.x читає META-INF/spring.factories, Boot 3.x → META-INF/spring/…AutoConfiguration.imports
- @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty — ключові умовні анотації
- @ConditionalOnMissingBean дозволяє перевизначити бін своєю конфігурацією
- Порядок: @AutoConfigureAfter / @AutoConfigureBefore для залежностей між конфігураціями
- Вимкнути: @SpringBootApplication(exclude = {…})
- Налагодження: –debug → Condition Evaluation Report
- Своя автоконфігурація — окремий модуль з .imports файлом
Часті уточнюючі запитання:
- Як Spring Boot дізнається, що сконфігурувати? → Сканує classpath, читає .imports/spring.factories, перевіряє @Conditional
- Чим Boot 3.x відрізняється від 2.x? → .imports файл замість spring.factories, швидше, підтримка GraalVM Native
- Як перевизначити автоконфігурацію? → Створити свій @Bean того ж типу — @ConditionalOnMissingBean не створить дефолтний
- Як дізнатися, чому бін НЕ створився? → Запустити з –debug, дивитися Condition Evaluation Report
Червоні прапорці (НЕ говорити):
- «Автоконфігурація створює всі біни завжди» — тільки якщо умови @Conditional виконані
- «spring.factories використовується в Boot 3.x» — замінений на .imports
- «@ConditionalOnMissingBean перевіряє classpath» — перевіряє наявність біна в контексті
- «Автоконфігурація сповільнює додаток в рантаймі» — впливає тільки на старт, не на runtime
Пов’язані теми:
- [[11. Які scope існують в Spring]]
- [[14. Коли Spring створює proxy]]
- [[17. Що робить анотація @Transactional]]