Какие знаешь этапы запуска контекста Spring?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Этапы запуска контекста Spring
Spring контекст — это ядро фреймворка, которое отвечает за управление бинами (beans), их жизненным циклом и зависимостями между ними. При запуске приложения контекст проходит через несколько критических этапов, которые нужно хорошо понимать.
1. Инициализация BeanFactory
Первый этап — создание BeanFactory, который является основой для управления бинами. Это базовый интерфейс для доступа к бинам в контексте.
BeanFactory beanFactory = new DefaultListableBeanFactory();
На этом этапе создаётся пустой контейнер, готовый к регистрации определений бинов.
2. Загрузка конфигурации (Configuration Loading)
Spring читает конфигурацию из разных источников:
- XML файлы (
spring-config.xml) - Java классы с аннотацией
@Configuration - Properties файлы для externalizing конфигурации
- Аннотации в классах (
@Component,@Service,@Repository)
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Each configuration source is parsed and stored as bean definitions.
3. BeanDefinition Registration
Все найденные классы и конфигурации преобразуются в BeanDefinition объекты. Эти объекты содержат метаинформацию о каждом бине:
- Класс бина
- Scope (singleton, prototype, request, session)
- Зависимости (dependencies)
- Параметры инициализации
public class BeanDefinitionExample {
// BeanDefinition содержит:
// - beanClass = UserService.class
// - scope = "singleton"
// - dependencies = [UserRepository]
}
4. BeanFactoryPostProcessor
После регистрации всех BeanDefinitions но ДО создания самих бинов, вызываются BeanFactoryPostProcessor:
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}
Это позволяет изменять определения бинов перед их инстанцированием. Например, PropertyPlaceholderConfigurer заменяет ${placeholder} на реальные значения.
5. Инстанцирование бинов (Bean Instantiation)
В этот момент Spring создаёт экземпляры всех singleton бинов (prototype создаются по требованию). Для каждого бина:
- Вызывается конструктор
- Устанавливаются свойства (dependency injection через setter или конструктор)
- Вызываются методы инициализации
UserService userService = new UserService(userRepository);
6. Dependency Injection
Внедрение зависимостей — критический этап. Spring использует несколько стратегий:
- Constructor Injection — самая безопасная
- Setter Injection — через
@Autowired - Field Injection — прямое внедрение в поля (не рекомендуется)
@Service
public class UserService {
private UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
}
7. BeanPostProcessor
После создания бина но ДО того как он полностью инициализирован, вызываются BeanPostProcessor:
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName);
Object postProcessAfterInitialization(Object bean, String beanName);
}
Это используется для прокси-объектов (например, в AOP) и кастомной инициализации.
8. Инициализация методов
Вызываются методы инициализации:
- Методы с аннотацией
@PostConstruct - Методы
afterPropertiesSet()изInitializingBean - Методы
init-methodиз XML конфигурации
@Service
public class UserService implements InitializingBean {
@PostConstruct
public void init() {
System.out.println("Bean инициализирован");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean вызван");
}
}
9. Готовность контекста
После создания и инициализации всех singleton бинов контекст считается полностью инициализированным. На этом этапе вызываются ContextRefreshedEvent слушатели.
10. Завершение (Shutdown)
При остановке приложения Spring вызывает методы уничтожения в обратном порядке:
- Методы с
@PreDestroy - Методы
destroy()изDisposableBean - Методы
destroy-methodиз конфигурации
@Service
public class UserService implements DisposableBean {
@PreDestroy
public void cleanup() {
System.out.println("Очистка ресурсов");
}
}
Полный жизненный цикл
Резюме в порядке выполнения:
- BeanFactory creation
- Configuration loading
- BeanDefinition registration
- BeanFactoryPostProcessor вызов
- Bean instantiation
- Dependency injection
- BeanPostProcessor.postProcessBeforeInitialization
- @PostConstruct / InitializingBean
- BeanPostProcessor.postProcessAfterInitialization
- Context ready (ContextRefreshedEvent)
- Application shutdown (PreDestroy / DisposableBean)
Понимание этих этапов критично для эффективной работы с Spring, особенно при отладке проблем с инициализацией и циклических зависимостей.