Ответ
Регистрация BeanDefinition происходит на этапе инициализации контекста приложения (ApplicationContext), до создания самих экземпляров бинов.
Последовательность этапов:
- Сканирование путей (
@ComponentScan) или обработка конфигураций (@Configuration). - Обнаружение классов-кандидатов (с аннотациями
@Component,@Service,@Repositoryи др.). - Создание
BeanDefinitionдля каждого кандидата. Этот объект-метаданные описывает, как создать бин (scope, lazy-init, зависимости). - Регистрация
BeanDefinitionво внутреннем реестре —BeanFactory(конкретно, вDefaultListableBeanFactory).
Пример инициализации:
@Configuration
@ComponentScan("com.example.app") // Шаг 1: Указание пути для сканирования
public class AppConfig { }
// Запуск контекста
public class Main {
public static void main(String[] args) {
// В этот момент происходит:
// 1. Сканирование пакета com.example.app
// 2. Создание BeanDefinition для найденных компонентов
// 3. Регистрация их в BeanFactory
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
// К этому моменту все BeanDefinition уже зарегистрированы.
// Экземпляры singleton-бинов создаются (если не lazy).
}
}
Важные нюансы:
- Регистрация != Создание. Бин-синглтон создается при старте контекста, но его
BeanDefinitionрегистрируется раньше. - Lazy-бины: Для них
BeanDefinitionрегистрируется сразу, а экземпляр создается при первом запросе (ctx.getBean(...)). - BeanFactoryPostProcessor может модифицировать
BeanDefinitionпосле регистрации, но до создания бинов.