Какой артефакт или метаданные обрабатываются во время компиляции Spring-приложения перед созданием BeanDefinition?

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

Ответ

Непосредственно перед созданием BeanDefinition на этапе обработки аннотаций (во время компиляции или загрузки класса) Spring работает с AnnotationMetadata.

Процесс и ключевые артефакты:

  1. Чтение класса: Spring (через ClassPathScanningCandidateComponentProvider) считывает байт-код класса.
  2. Получение метаданных: Для класса извлекается ClassMetadata (информация о классе) и, что важнее, AnnotationMetadata.
    • AnnotationMetadata содержит информацию обо всех аннотациях класса (например, @Component, @Service, @Scope, @Lazy).
  3. Анализ аннотаций: На основе AnnotationMetadata Spring определяет, является ли класс кандидатом на создание бина, его scope, lazy-инициализацию и другие атрибуты.
  4. Создание BeanDefinition: Только после этого анализа создается объект BeanDefinition (например, ScannedGenericBeanDefinition), который инкапсулирует эти метаданные для последующего использования IoC-контейнером при создании экземпляров бинов.

Наглядный пример: Для класса:

@Service
@Lazy
@Scope("prototype")
public class OrderService {
    // ...
}

Во время обработки Spring сначала получит AnnotationMetadata, содержащее данные об аннотациях @Service, @Lazy и @Scope. На основе этих данных будет построен BeanDefinition, у которого будут установлены флаги: lazyInit = true, scope = "prototype".

Техническая деталь: В современных Spring-приложениях (особенно с Spring Boot) эта обработка часто происходит не во время компиляции javac, а во время загрузки классов JVM или с помощью пост-процессоров (как ConfigurationClassPostProcessor), которые читают аннотации и регистрируют BeanDefinition в BeanFactory. Ключевой ввод — это именно метаданные аннотаций (AnnotationMetadata).