Каков процесс запуска Spring Boot приложения?

«Каков процесс запуска Spring Boot приложения?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Запуск Spring Boot приложения через SpringApplication.run() инициирует сложный процесс настройки и инициализации контейнера Spring.

Основные этапы запуска:

  1. Инициализация и создание контекста приложения: Создаётся экземпляр ApplicationContext (чаще всего AnnotationConfigServletWebServerApplicationContext для веб-приложений) — это контейнер, управляющий бинами.
  2. Сканирование классов и регистрация бинов: Контекст сканирует classpath на наличие классов, помеченных стереотипными аннотациями (@Component, @Service, @Repository, @Controller), и регистрирует их как определения бинов.
  3. Загрузка конфигураций: Обрабатываются все источники конфигурации: классы с @Configuration, методы @Bean, файлы application.properties/application.yml, профили (@Profile).
  4. Запуск встроенного веб-сервера: Если в classpath есть spring-boot-starter-web, автоматически запускается встроенный сервер (Tomcat, Jetty или Undertow) на порту, указанном в конфигурации.
  5. Запуск ApplicationRunner и CommandLineRunner: Выполняются все бины, реализующие эти интерфейсы, что позволяет выполнить код после полной инициализации контекста.

Пример точки входа:

@SpringBootApplication // Эквивалент @Configuration, @EnableAutoConfiguration, @ComponentScan
public class MyApplication {
    public static void main(String[] args) {
        // Запускает весь процесс и возвращает управляемый ApplicationContext
        SpringApplication.run(MyApplication.class, args);
    }
}

После этого Spring управляет жизненным циклом бинов: создаёт их, внедряет зависимости (через @Autowired), вызывает методы инициализации (@PostConstruct) и уничтожения (@PreDestroy).