Как работает автоконфигурация Spring Boot?
- Как Spring Boot понимает, какие бины создать?
- Как переопределить автоконфигурацию?
Spring Boot подключает классы автоконфигурации из списка META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (до 2.7 — spring.factories). Каждая создаёт бины по условиям: есть ли класс на classpath, есть ли уже такой бин, задано ли свойство.
- @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty
- Свой бин того же типа — и автоконфигурация отступает
- Отчёт:
--debugили /actuator/conditions
А ещё Исключить: @SpringBootApplication(exclude = ...) или spring.autoconfigure.exclude
Подробно
Механизм. @SpringBootApplication включает @EnableAutoConfiguration. Он загружает список классов автоконфигурации из всех jar на classpath: в Spring Boot 2.7+ — файл AutoConfiguration.imports, раньше — spring.factories. Каждый класс — обычная @Configuration (точнее @AutoConfiguration), но с условиями.
Условия:
@ConditionalOnClass(DataSource.class)— библиотека есть на classpath;@ConditionalOnMissingBean— пользователь не определил свой бин;@ConditionalOnProperty("spring.cache.type")— задано свойство;@ConditionalOnWebApplication,@ConditionalOnBeanи другие.
Пример: добавили spring-boot-starter-data-jpa — на classpath Hibernate и HikariCP; автоконфигурация создаёт DataSource из spring.datasource.*, EntityManagerFactory, менеджер транзакций. Объявили свой DataSource — @ConditionalOnMissingBean выключит стандартный.
Отладка: java -jar app.jar --debug печатает отчёт условий (какие конфигурации применены и почему нет), то же в /actuator/conditions.
Свой стартер — модуль с классом @AutoConfiguration и записью в AutoConfiguration.imports.
Что хотят услышать
- Откуда берутся классы автоконфигурации.
- Условные аннотации и примеры.
- Как переопределить и исключить.
- Как посмотреть отчёт условий.
Частые ошибки
- Считать автоконфигурацию «магией» без понимания условий.
- Не знать, как отключить ненужную автоконфигурацию.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Boot сканирует classpath и создаёт бины для всех найденных классов без каких-либо условий
- ✓Классы из AutoConfiguration.imports применяются по условиям @ConditionalOn…
- ✗Конфигурация читается только из XML
- ✗Boot случайно подбирает бины при старте
Что спросят дальше
- Как отключить конкретную автоконфигурацию?
- Где Boot ищет список автоконфигураций?
Разбор темы
- Spring Boot: автоконфигурация и starters
@SpringBootApplication и starters, механизм автоконфигурации по условиям, переопределение через @ConditionalOnMissingBean, внешняя конфигурация и её приоритеты.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.