Что такое Spring Boot Starters и как они помогают управлять зависимостями?
Spring Boot Starters — POM-зависимости-агрегаторы, которые подтягивают согласованный набор библиотек с проверенными версиями. Один стартер заменяет десятки ручных зависимостей.
Spring Boot Starters
Spring Boot Starters — это специальные зависимости-агрегаторы. Каждый стартер не содержит кода, а только тянет за собой набор транзитивных зависимостей (библиотеки, драйверы, конфигурационные модули) с согласованными и проверенными версиями. Это избавляет от необходимости вручную подбирать совместимые версии десятков библиотек.
Как устроен стартер
Стартер — это POM-файл с тщательно подобранными зависимостями. Например, spring-boot-starter-web тянет:
spring-webmvc— Spring MVCspring-boot-starter-tomcat— встроенный Tomcatspring-boot-starter-json— Jackson для JSONspring-boot-starter— базовый стартер с logging (Logback) и spring-core
Популярные стартеры
spring-boot-starter-web— REST API, Spring MVC, встроенный Tomcatspring-boot-starter-data-jpa— Hibernate, Spring Data JPAspring-boot-starter-security— Spring Securityspring-boot-starter-test— JUnit 5, Mockito, AssertJ, Spring Testspring-boot-starter-validation— Bean Validation (Hibernate Validator)spring-boot-starter-actuator— health checks, metrics, endpointsspring-boot-starter-data-redis— Spring Data Redis + Lettucespring-boot-starter-webflux— реактивный веб с Project Reactorspring-boot-starter-amqp— RabbitMQ через Spring AMQPspring-boot-starter-mail— JavaMail + Spring Mail
Пример: REST API с JPA и валидацией
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Замена встроенного сервера
Стартеры позволяют легко поменять встроенный контейнер — достаточно исключить Tomcat и добавить Jetty или Undertow:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
Создание собственного стартера
Для переиспользования внутренних библиотек создают кастомные стартеры по соглашению: имя mycompany-spring-boot-starter (не spring-boot-starter-*, чтобы не конфликтовать с официальными).
// autoconfigure модуль
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyProperties props) {
return new MyService(props.getApiKey());
}
}
Подводные камни
- Не указывать версию зависимости, управляемой через
spring-boot-dependenciesBOM — если указать конкретную версию, она может конфликтовать с другими компонентами стартера. - Подключать несколько стартеров с пересекающимися зависимостями без
exclusions— например,spring-boot-starter-webиspring-boot-starter-webfluxв одном проекте запускают оба контейнера. - Использовать
spring-boot-starter-testбезscope=test— тестовые библиотеки попадут в production JAR. - Не проверять, что именно тянет стартер:
mvn dependency:treeили./gradlew dependenciesпокажут транзитивные зависимости и возможные конфликты. - Создавать собственный стартер с именем
spring-boot-starter-*— такое именование зарезервировано для официальных артефактов Spring. - Ожидать, что стартер содержит всё необходимое: например,
spring-boot-starter-data-jpaне включает JDBC-драйвер — его нужно добавлять отдельно.
Common mistakes
- Путать термин «spring boot starters» с соседним механизмом Spring Boot.
- Не называть границу lifecycle, transaction, thread или request для «spring boot starters».
- Игнорировать production-эффекты «spring boot starters»: latency, SQL shape, memory, security или observability.
What the interviewer is testing
- Попросить объяснить механизм «spring boot starters» на минимальном примере.
- Проверить, видит ли кандидат failure mode и диагностику для «spring boot starters».
- Уточнить, какие настройки или API меняют «spring boot starters» в реальном сервисе.