Ответ
Жизненный цикл контекста Spring (ApplicationContext) включает следующие ключевые этапы:
- Загрузка конфигурации и создание BeanFactory — чтение конфигурации (XML, аннотации, JavaConfig) и создание
BeanDefinitionдля каждого бина. - Создание экземпляров бинов (Instantiation) — контейнер создает экземпляры бинов в соответствии с их scope (singleton, prototype и др.).
- Внедрение зависимостей (Dependency Injection) — разрешение и инъекция зависимостей через конструктор, сеттеры или поля.
- Обработка callback-интерфейсов и аннотаций жизненного цикла — выполнение методов, помеченных как
@PostConstruct, или реализующихInitializingBean.afterPropertiesSet(). - Обработка BeanPostProcessor — выполнение пользовательской логики до и после инициализации каждого бина (например, для проксирования через AOP).
- Готовность (Ready) — контекст полностью инициализирован, бины готовы к использованию.
- Уничтожение (Destruction) — при закрытии контекста (
context.close()) вызываются методы@PreDestroyилиDisposableBean.destroy().
Пример конфигурации с явным указанием методов жизненного цикла:
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit", destroyMethod = "customCleanup")
public DataSource dataSource() {
return new HikariDataSource();
}
}
public class MyService {
@PostConstruct
public void init() {
// Логика инициализации после инъекции зависимостей
}
@PreDestroy
public void cleanup() {
// Логика освобождения ресурсов перед уничтожением
}
}
Почему это важно: Понимание жизненного цикла позволяет корректно управлять ресурсами (открытие/закрытие соединений), выполнять валидацию конфигурации и внедрять кастомную логику через BeanPostProcessor.