Что происходит на этапе компиляции (Compile Time) в Spring Boot приложении?

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

Ответ

Compile Time (время компиляции) в Spring Boot — это этап трансляции исходного Java-кода в байт-код (.class файлы), во время которого также обрабатываются аннотации и метаданные, специфичные для Spring.

Основные процессы:

  1. Обработка аннотаций (Annotation Processing):

    • Компилятор Java (javac) и инструменты (как Annotation Processors — APT) сканируют и обрабатывают аннотации.
    • Пример: Lombok генерирует геттеры, сеттеры и конструкторы на основе аннотаций @Data, @Getter.
  2. Генерация метаданных Spring:

    • Аннотации Spring (@Component, @Service, @Autowired, @Configuration) считываются, но их основная обработка происходит во время запуска приложения (Runtime).
    • Однако ошибки, обнаруживаемые компилятором (например, циклические зависимости через конструктор), будут выявлены на этом этапе.
  3. AOT (Ahead-Of-Time) компиляция (для GraalVM Native Image):

    • В контексте нативной компиляции Spring Boot выполняет дополнительный анализ на этапе сборки, чтобы определить структуру приложения, бины и пути, которые должны быть доступны в нативном образе.

Пример и важное уточнение:

@SpringBootApplication // Аннотация маркирует класс. Её семантика раскрывается при запуске.
public class MyApplication {
    public static void main(String[] args) {
        // Сам вызов SpringApplication.run() выполняется в Runtime
        SpringApplication.run(MyApplication.class, args);
    }
}

Итог: На этапе компиляции Spring Boot сам по себе не "запускает" контекст. Основная «магия» Spring (создание контекста, инъекция зависимостей, создание прокси для AOP) происходит во время старта приложения (Runtime). Compile Time важен для проверки синтаксиса, обработки аннотаций Lombok и, в случае нативной сборки, для AOT-анализа.