Вопрос проверяет понимание того, как Spring «знает», какие бины создавать и как именно это делать.
BeanDefinition — это метаданные о бине.
Она описывает, как создать бин и какие у него свойства.
Spring читает BeanDefinition при старте контекста.
На основе этих данных контейнер создает бины.
Spring не создает бины «из воздуха» — он опирается на описание каждого бина.
BeanDefinition — это объект, содержащий полное описание бина для Spring-контейнера.
В нем нет самого объекта, только информация о нем.
Обычно BeanDefinition содержит:
Имя класса бина
Scope (singleton, prototype)
Способ создания (конструктор, фабричный метод)
Список зависимостей
Init и destroy методы
Spring формирует BeanDefinition из:
Аннотаций (@Component, @Service)
Java-конфигурации (@Bean)
XML-конфигурации
BeanDefinition активно используется:
На этапе старта контекста
При сканировании классов
При создании прокси и автоконфигурации
Работа с BeanDefinition позволяет:
Динамически регистрировать бины
Писать свои BeanFactoryPostProcessor
Глубже кастомизировать Spring
BeanDefinition — это описание бина, а не сам бин.
Spring сначала работает с метаданными, а уже потом создает объекты.