Короткий ответ
@SpringBootApplication — основная аннотация класса запуска Spring Boot-приложения. Она является составной и объединяет три аннотации: @Configuration, @EnableAutoConfiguration и @ComponentScan.
Как это работает подробнее
Запуск выполняет метод SpringApplication.run(...): создаётся ApplicationContext, выполняется сканирование компонентов, применяется авто-конфигурация, загружаются свойства конфигурации и запускается встроенный веб-сервер. Авто-конфигурация анализирует, какие зависимости есть в classpath (какие стартеры подключены), и на их основе сама создаёт и настраивает нужные бины — например, DataSource или EntityManagerFactory.
- Составляющие аннотации:
@Configurationпомечает класс как источник бинов,@EnableAutoConfigurationвключает авто-конфигурацию, а@ComponentScanсканирует пакет главного класса и подпакеты в поисках@Component,@Service,@Repository,@Controller. - Условные аннотации —
@ConditionalOnClass,@ConditionalOnBean,@ConditionalOnMissingBean— включают конфигурацию только при выполнении условий: нужный класс есть в classpath или бин ещё не создан. - Отключение авто-конфигурации: её можно исключить через атрибут
exclude, например@SpringBootApplication(exclude = DataSourceAutoConfiguration.class).
Пример кода
Application.java
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}Что использовать на практике
- Класс запуска размещайте в корневом пакете, чтобы
@ComponentScanпокрыл все подпакеты с компонентами. - Подключайте стартеры и доверяйте авто-конфигурации по умолчанию — нужные бины создадутся сами.
- Если нужно своё поведение, переопределяйте бин, и авто-конфигурация отступит благодаря
@ConditionalOnMissingBean, либо исключайте конфигурацию черезexclude.
Подводные камни
- Аннотация уже включает
@Configuration,@ComponentScanи@EnableAutoConfiguration, дублировать их рядом с ней не нужно. - Компоненты вне пакета класса запуска и его подпакетов не будут найдены сканированием.
- Авто-конфигурация включается по наличию классов в classpath: изменение набора стартеров меняет набор автоматически настроенных бинов.
Как отвечать на собеседовании
- Объясните, что
@SpringBootApplicationобъединяет@Configuration,@EnableAutoConfigurationи@ComponentScan→ опишите запуск:SpringApplication.runсоздаёт контекст, сканирует компоненты и запускает сервер → расскажите, как авто-конфигурация анализирует classpath и применяет условные аннотации → упомяните@ConditionalOnMissingBeanиexcludeкак точки настройки.