Как обеспечивается сканирование пакетов и создание бинов при подключении стартеров в Spring Boot
Что проверяют
Различаете ли вы два механизма: сканирование компонентов вашего кода и автоконфигурацию, через которую приходят бины стартеров. Следом почти всегда спрашивают, почему ваш собственный бин отключает стандартный и как узнать, какая автоконфигурация сработала.
Как отвечать
@SpringBootApplication объединяет три аннотации:
@SpringBootConfiguration: класс становится конфигурацией;@ComponentScan: сканирует пакет главного класса и все вложенные, регистрируя@Component,@Service,@Repository,@Controller,@Configuration. ФильтрAutoConfigurationExcludeFilterпри этом не пускает в сканирование классы автоконфигурации;@EnableAutoConfiguration: черезAutoConfigurationImportSelectorподключает автоконфигурации из всех JAR на classpath.
Главное: бины стартера находятся не сканированием. Стартер это набор зависимостей, а конфигурация лежит в модуле автоконфигурации. Список её классов записан в META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (с Boot 2.7), а в Boot 3 регистрацию автоконфигураций через spring.factories убрали.
Каждый такой класс помечен @AutoConfiguration и снабжён условиями:
@ConditionalOnClass: нужная библиотека есть на classpath;@ConditionalOnMissingBean: вы не объявили свой бин этого типа;@ConditionalOnProperty: включено нужное свойство.
Автоконфигурации обрабатываются после ваших конфигураций, поэтому свой DataSource или ObjectMapper вытесняет стандартный.
Увидеть результат: запуск с --debug печатает отчёт об условиях, эндпоинт /actuator/conditions отдаёт то же в JSON. Лишнее отключают через exclude в @SpringBootApplication или свойство spring.autoconfigure.exclude.
Где спотыкаются
Говорят, что бины стартера находит @ComponentScan. Пакеты библиотек лежат вне вашего пакета, и сканирование до них не доходит.
Кладут главный класс в глубокий пакет, а сервисы в соседний. Бины не находятся, и приложение падает с NoSuchBeanDefinitionException.
В своём стартере регистрируют автоконфигурацию в spring.factories по старым статьям. На Boot 3 она молча не загрузится.