Ответ
Запуск Spring Boot приложения через SpringApplication.run() инициирует сложный процесс настройки и инициализации контейнера Spring.
Основные этапы запуска:
- Инициализация и создание контекста приложения: Создаётся экземпляр
ApplicationContext(чаще всегоAnnotationConfigServletWebServerApplicationContextдля веб-приложений) — это контейнер, управляющий бинами. - Сканирование классов и регистрация бинов: Контекст сканирует classpath на наличие классов, помеченных стереотипными аннотациями (
@Component,@Service,@Repository,@Controller), и регистрирует их как определения бинов. - Загрузка конфигураций: Обрабатываются все источники конфигурации: классы с
@Configuration, методы@Bean, файлыapplication.properties/application.yml, профили (@Profile). - Запуск встроенного веб-сервера: Если в classpath есть
spring-boot-starter-web, автоматически запускается встроенный сервер (Tomcat, Jetty или Undertow) на порту, указанном в конфигурации. - Запуск 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).