Вопрос 22 · Раздел 5

Что такое starter в Spring Boot?

Стартеры могут тянуть лишние транзитивные зависимости. Если нужен минимальный classpath (GraalVM Native Image) — используйте или добавляйте зависимости вручную.

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Starter — это готовый набор зависимостей для определённой функциональности.

Без Starter:

<!-- Нужно добавить 5+ зависимостей вручную -->
<dependency><groupId>org.springframework</groupId>...</dependency>
<dependency><groupId>org.hibernate</groupId>...</dependency>
...

Со Starter:

<!-- Одна зависимость — всё работает! -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Популярные стартеры:

  • spring-boot-starter-web → REST API
  • spring-boot-starter-data-jpa → Базы данных
  • spring-boot-starter-test → Тестирование

🟡 Middle Level

Архитектура стартера

mylib-spring-boot-starter
  → mylib-autoconfigure (конфигурация)
    → @ConditionalOnClass(...)
    → @Bean методы
  → mylib (основная библиотека)

Naming Convention

spring-boot-starter-*     → Официальные стартеры
*-spring-boot-starter     → Сторонние стартеры

BOM (Bill of Materials)

<!-- Управляет версиями всех зависимостей -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
</parent>

→ Нет "Jar Hell" → все версии совместимы

spring-boot-dependencies — это родительский POM с <dependencyManagement>, который фиксирует версии сотен библиотек. Вы наследуете его через <parent> или импортируете в свой <dependencyManagement>.

Кастомизация

# Стартер предоставляет дефолтные настройки
# Вы можете переопределить через application.yaml
mylib:
  enabled: true
  timeout: 5000

🔴 Senior Level

Ограничения стартеров

Стартеры могут тянуть лишние транзитивные зависимости. Если нужен минимальный classpath (GraalVM Native Image) — используйте <exclusions> или добавляйте зависимости вручную.

Создание своего стартера

// В autoconfigure модуле:
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean(MyService.class)
public class MyLibAutoConfiguration {
    
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

// Spring Boot 2.7+: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
// До 2.7: META-INF/spring.factories
com.example.MyLibAutoConfiguration

ConfigurationProperties

@ConfigurationProperties("mylib")
public class MyLibProperties {
    private boolean enabled = true;
    private int timeout = 5000;
}

 IDE автодополнение из spring-configuration-metadata.json

Native Image поддержка

Spring Boot 3 + GraalVM:
  → Hint-файлы для рефлексии
  → AOT компиляция
  → Стартер должен поддерживать Native Image

Production Experience

Реальный сценарий: корпоративный стартер

50 микросервисов → одинаковая настройка логирования
→ Создали mycompany-logging-starter
→ Все сервисы получили единый формат логов

Best Practices

  1. Разделяйте autoconfigure и starter модули
  2. @ConditionalOnMissingBean → позволяйте переопределять
  3. Naming → *-spring-boot-starter для сторонних
  4. BOM → управление версиями
  5. ConfigurationProperties → настройка через YAML
  6. Native Image → поддержка GraalVM

Резюме для Senior

  • Starter = зависимости + автоконфигурация
  • BOM → совместимые версии
  • @ConditionalOnMissingBean → переопределение
  • Naming → *-spring-boot-starter для сторонних
  • ConfigurationProperties → настройка через YAML
  • Native Image → поддержка в Spring Boot 3

🎯 Шпаргалка для интервью

Обязательно знать:

  • Starter = одна зависимость вместо множества транзитивных зависимостей
  • spring-boot-dependencies (BOM) фиксирует версии всех библиотек — нет «Jar Hell»
  • Стартер = autoconfigure модуль (@ConditionalOnClass, @Bean) + зависимости
  • @ConditionalOnMissingBean позволяет пользователям переопределять бины
  • Сторонние стартеры именуются -spring-boot-starter, официальные — spring-boot-starter-
  • ConfigurationProperties даёт YAML-настройку и IDE автодополнение
  • Свой стартер: @AutoConfiguration + META-INF/spring/…AutoConfiguration.imports (Spring Boot 2.7+)

Частые уточняющие вопросы:

  • Как создать свой стартер? — Модуль autoconfigure с @AutoConfiguration + регистрация в AutoConfiguration.imports.
  • Зачем нужен BOM? — Фиксирует совместимые версии сотен библиотек через dependencyManagement.
  • Можно ли переопределить бин из стартера? — Да, через @ConditionalOnMissingBean — ваш бин заменит дефолтный.
  • Что делать с лишними транзитивными зависимостями? — Использовать в Maven или собирать classpath вручную для GraalVM.

Красные флаги (НЕ говорить):

  • «Starter — это просто jar с зависимостями» — нет, ещё есть автоконфигурация.
  • «Можно называть свой стартер spring-boot-starter-*» — это зарезервировано для официальных.
  • «BOM — это обычная зависимость» — нет, это dependencyManagement для версий.
  • «Стартеры работают без автоконфигурации» — без неё это просто набор зависимостей.

Связанные темы:

  • [[21. Как работает @SpringBootApplication]]
  • [[24. Что такое @Configuration класс]]
  • [[29. Что такое profiles in Spring]]
  • [[26. Что делает аннотация @Autowired]]