Что такое starter в 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]]