Какие аннотации используются в точке входа Spring Boot приложения
Что проверяют
Понимаете ли вы, что скрывается за @SpringBootApplication и почему расположение главного класса влияет на то, какие бины найдутся. Следом часто спрашивают, как отключить конкретную автоконфигурацию и откуда Boot вообще знает, что настраивать.
Как отвечать
Точка входа это класс с main, где вызывается SpringApplication.run(App.class, args), и одна аннотация @SpringBootApplication. Она объединяет три:
@SpringBootConfiguration: разновидность@Configuration, класс может объявлять бины через@Bean. По ней тестовая инфраструктура Boot находит основную конфигурацию;@EnableAutoConfiguration: подключает автоконфигурации из зависимостей. Их список Boot читает изMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, а каждая срабатывает по условиям вроде@ConditionalOnClassи@ConditionalOnMissingBean. Поэтому свой бинDataSourceотменяет стандартный;@ComponentScan: сканирует пакет главного класса и все вложенные, с фильтрами, которые исключают из сканирования сами автоконфигурации.
Полезные атрибуты: exclude = DataSourceAutoConfiguration.class, чтобы выключить конкретную автоконфигурацию, и scanBasePackages, если компоненты лежат вне корневого пакета. Какие автоконфигурации сработали и почему, показывает отчёт условий при запуске с --debug.
На главном классе рядом часто появляются @EnableScheduling, @EnableAsync, @EnableCaching, @ConfigurationPropertiesScan. Это работает, но у такого решения есть цена для тестов.
Где спотыкаются
Кладут главный класс во вложенный пакет, а сервисы в соседний. Сканирование их не видит, и приложение падает с NoSuchBeanDefinitionException.
Вешают на главный класс @EnableJpaRepositories или @EntityScan без нужды. Срезовые тесты вроде @WebMvcTest берут конфигурацию с главного класса и начинают поднимать репозитории, которых в срезе нет. Такие аннотации лучше вынести в отдельный класс с @Configuration.
Думают, что автоконфигурации регистрируются через spring.factories. Для автоконфигураций этот путь убран в Spring Boot 3.0, и свой стартер без файла AutoConfiguration.imports просто не подключится.