Цикл жизни

Тема дорожной карты · Spring Boot

Жизненный цикл Spring Bean описывает последовательность шагов, выполняемых Spring IoC-контейнером с момента создания экземпляра бина до его уничтожения, предоставляя разработчикам хуки для выполнения логики инициализации и очистки на каждой фазе. После создания экземпляра бина Spring IoC-контейнером (через инъекцию конструктора или фабричный метод @Bean) он внедряет зависимости через @Autowired, затем вызывает реализации BeanPostProcessor и, наконец, вызывает методы @PostConstruct перед тем, как бин становится доступным в Spring Boot-приложении. Аннотация @PostConstruct (или InitializingBean.afterPropertiesSet()) — стандартное место для логики инициализации: открытия соединений, прогрева кэшей, валидации конфигурации; @PreDestroy (или DisposableBean.destroy()) обеспечивает очистку при закрытии ApplicationContext. Spring Boot запускает завершение работы ApplicationContext при завершении JVM, получении SIGTERM или при POST на /actuator/shutdown (если включён), проходя через фазу уничтожения жизненного цикла Spring Bean в порядке, обратном зависимостям, соблюдая безопасные последовательности завершения. Понимание жизненного цикла Spring Bean обязательно для правильного управления ресурсами в бинах @Service, @Repository и инфраструктурных бинах, а также для предотвращения гонок при запуске Spring Boot и корректном завершении работы в контейнерных средах.

Как это работает

Цикл жизни (Dependency Injection + Inversion of Control): Spring-контейнер инстанцирует + связывает ваши бины вместо new везде. @Component (и стереотипы @Service, @Repository, @Controller) маркируют класс как Spring-managed bean; @Bean-методы в @Configuration-классе производят явные бины. @Autowired инжектит зависимости. Bean scopes (singleton дефолт, prototype, request, session) контролируют lifetime. Lifecycle hooks (@PostConstruct, @PreDestroy) запускают init/cleanup.

Когда применять

Предпочитайте constructor injection (final поля + @RequiredArgsConstructor через Lombok) — immutable, тестируемо, fail fast на отсутствующих зависимостях. Field/setter injection только для legacy. Бины stateless; singleton + state = concurrent-баги. Не инжектьте ApplicationContext чтобы "найти" бины — это service locator + ломает IoC.

Типичные ошибки

Ловушки Цикл жизни: field injection (тяжело тестировать, скрывает constructor-зависимости); circular зависимости (Spring 3.x отклоняет по дефолту — фиксите дизайн); singleton-бины с mutable state (race conditions); @Autowired на non-final поле, переприсваиваемом позже (тихие баги).

Связанные понятия

Полезные ресурсы