Что такое автоконфигурация в 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 создаёт прокси]]
- [[17. Что делает аннотация @Transactional]]