Как Spring Boot отличает обычную библиотеку (JAR) от стартера (Starter)?

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

Ответ

Spring Boot определяет стартеры по их структуре и метаданным, которые активируют механизм автоконфигурации.

Основные отличия стартера:

  1. Специальный артефакт: Имя стартера следует шаблону spring-boot-starter-* (например, spring-boot-starter-web).
  2. Метаданные автоконфигурации: Ключевой файл META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports внутри JAR-файла стартера. В нем перечислены классы автоматической конфигурации (@Configuration), которые должны быть загружены при определенных условиях (проверяемых через @Conditional аннотации).
  3. Набор зависимостей: Стартер — это, по сути, pom.xml, который агрегирует все необходимые для конкретной функциональности транзитивные зависимости (например, стартер web включает Tomcat, Spring MVC, Jackson).

Пример pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Что происходит при запуске:

  1. Spring Boot сканирует classpath.
  2. Находит все файлы AutoConfiguration.imports в подключенных стартерах.
  3. Загружает и оценивает указанные в них классы конфигурации на основе условий (@ConditionalOnClass, @ConditionalOnProperty и т.д.).
  4. Применяет только те конфигурации, условия которых выполнены.

Обычный JAR не содержит файла AutoConfiguration.imports, поэтому Spring Boot не применяет для него автоматическую настройку.