Spring BootJuniorTechnical

Что такое Spring Boot Starters и как они помогают управлять зависимостями?

Spring Boot Starters — POM-зависимости-агрегаторы, которые подтягивают согласованный набор библиотек с проверенными версиями. Один стартер заменяет десятки ручных зависимостей.

Spring Boot Starters

Spring Boot Starters — это специальные зависимости-агрегаторы. Каждый стартер не содержит кода, а только тянет за собой набор транзитивных зависимостей (библиотеки, драйверы, конфигурационные модули) с согласованными и проверенными версиями. Это избавляет от необходимости вручную подбирать совместимые версии десятков библиотек.

Как устроен стартер

Стартер — это POM-файл с тщательно подобранными зависимостями. Например, spring-boot-starter-web тянет:

  • spring-webmvc — Spring MVC
  • spring-boot-starter-tomcat — встроенный Tomcat
  • spring-boot-starter-json — Jackson для JSON
  • spring-boot-starter — базовый стартер с logging (Logback) и spring-core

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

  • spring-boot-starter-web — REST API, Spring MVC, встроенный Tomcat
  • spring-boot-starter-data-jpa — Hibernate, Spring Data JPA
  • spring-boot-starter-security — Spring Security
  • spring-boot-starter-test — JUnit 5, Mockito, AssertJ, Spring Test
  • spring-boot-starter-validation — Bean Validation (Hibernate Validator)
  • spring-boot-starter-actuator — health checks, metrics, endpoints
  • spring-boot-starter-data-redis — Spring Data Redis + Lettuce
  • spring-boot-starter-webflux — реактивный веб с Project Reactor
  • spring-boot-starter-amqp — RabbitMQ через Spring AMQP
  • spring-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-dependencies BOM — если указать конкретную версию, она может конфликтовать с другими компонентами стартера.
  • Подключать несколько стартеров с пересекающимися зависимостями без 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» в реальном сервисе.

Sources

Related topics