Питання 22 · Розділ 5

Що таке стартер в 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]]