Що таке стартер в Spring Boot?
Стартери можуть тягнути зайві транзитивні залежності. Якщо потрібен мінімальний classpath (GraalVM Native Image) — використовуйте
🟢 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 APIspring-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
- Розділяйте autoconfigure та starter модулі
- @ConditionalOnMissingBean → дозволяйте перевизначати
- Naming → *-spring-boot-starter для сторонніх
- BOM → керування версіями
- ConfigurationProperties → налаштування через YAML
- 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]]