Ответ
Процесс создания бина в Spring включает несколько ключевых сущностей, которые взаимодействуют на разных этапах жизненного цикла:
Основные компоненты:
- BeanDefinition — содержит метаданные бина: класс, scope (
singleton,prototype), ленивую инициализацию (lazy-init), зависимости и свойства. - BeanFactory — базовый интерфейс IoC-контейнера, отвечающий за создание и управление бинами.
- ApplicationContext — расширенный контейнер, наследующий
BeanFactory, добавляющий поддержку AOP, международализации, событий и многое другое. - BeanPostProcessor — интерфейс для кастомизации бинов после их инстанцирования, но до/после инициализации (например,
@PostConstruct). - BeanFactoryPostProcessor — интерфейс для модификации BeanDefinition до создания экземпляров бинов.
Пример кастомизации через BeanPostProcessor:
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
// Логика, выполняемая ДО вызова методов инициализации бина
System.out.println("Before init for bean: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
// Логика, выполняемая ПОСЛЕ инициализации бина
return bean;
}
}
Типичный порядок создания бина:
- Загрузка и парсинг
BeanDefinition. - Применение
BeanFactoryPostProcessor(если есть). - Инстанцирование (создание экземпляра через конструктор или фабричный метод).
- Внедрение зависимостей (пополнение полей, сеттеры).
- Применение
BeanPostProcessor.postProcessBeforeInitialization. - Инициализация (вызов методов, помеченных
@PostConstruct, илиInitializingBean.afterPropertiesSet()). - Применение
BeanPostProcessor.postProcessAfterInitialization. - Бин готов к использованию. Для singleton-бинов помещается в кэш.