На каком этапе Spring регистрирует определение бина (BeanDefinition)?

«На каком этапе Spring регистрирует определение бина (BeanDefinition)?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Регистрация BeanDefinition происходит на этапе инициализации контекста приложения (ApplicationContext), до создания самих экземпляров бинов.

Последовательность этапов:

  1. Сканирование путей (@ComponentScan) или обработка конфигураций (@Configuration).
  2. Обнаружение классов-кандидатов (с аннотациями @Component, @Service, @Repository и др.).
  3. Создание BeanDefinition для каждого кандидата. Этот объект-метаданные описывает, как создать бин (scope, lazy-init, зависимости).
  4. Регистрация 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 после регистрации, но до создания бинов.