🍃 Раздел 5 · Вопрос #22

Что такое starter в Spring Boot

Чтобы запустить простейший REST-контроллер с поддержкой JSON, разработчик должен был вручную найти и прописать в pom.xml более 10 библиотек: spring-web, spring-webmvc, jackson-d...


🟢 Junior Level

Starter (стартер) в Spring Boot — это специальный агрегирующий дескриптор зависимостей (шаблонный набор библиотек), который позволяет одной строчкой в pom.xml или build.gradle подключить всю необходимую функциональность для решения конкретной технологической задачи.

Проблема, которую решает Starter

До появления стартеров (Классический Spring): Чтобы запустить простейший REST-контроллер с поддержкой JSON, разработчик должен был вручную найти и прописать в pom.xml более 10 библиотек: spring-web, spring-webmvc, jackson-databind, jackson-core, tomcat-embed-core, hibernate-validator и вручную следить за их совместимостью версий (риск попасть в так называемый Jar Hell).

В Spring Boot со стартером: Достаточно подключить один артефакт:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot автоматически подтянет все транзитивные зависимости протестированных и гарантированно совместимых версий.

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

  • spring-boot-starter-web — разработка REST API и веб-приложений (включает Spring MVC, Jackson и встроенный Tomcat).
  • spring-boot-starter-data-jpa — работа с базами данных (Spring Data JPA, Hibernate, HikariCP).
  • spring-boot-starter-security — аутентификация и авторизация (Spring Security).
  • spring-boot-starter-validation — валидация параметров и DTO (Hibernate Validator, спецификация Jakarta Validation).
  • spring-boot-starter-test — модульное и интеграционное тестирование (JUnit 5, Mockito, AssertJ, Hamcrest, Spring Test).

🟡 Middle Level

Правила именования стартеров (Naming Convention)

Команда Spring установила строгое соглашение об именовании артефактов:

Официальные стартеры от Spring / VMware:
    spring-boot-starter-{name}
    Пример: spring-boot-starter-data-redis, spring-boot-starter-amqp

Сторонние и корпоративные стартеры (Open Source, компании):
    {name}-spring-boot-starter
    Пример: mybatis-spring-boot-starter, grpc-spring-boot-starter, company-audit-spring-boot-starter

Важно: Сторонним разработчикам запрещено начинать имя артефакта со spring-boot-starter-*, так как этот префикс зарезервирован для официального дерева модулей Spring.

Управление версиями: BOM (Bill of Materials)

Стартеры не содержат номеров версий в коде проекта, если проект подключен к BOM:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
</parent>

Родительский POM транзитивно наследует spring-boot-dependencies — специальный POM-файл без кода, в секции <dependencyManagement> которого жестко зафиксированы согласованные версии сотен сторонних библиотек (SLF4J, PostgreSQL, Hibernate, Netty, Jackson).

Как использовать Spring Boot без spring-boot-starter-parent

Если в проекте уже есть корпоративный <parent>, BOM подключается через scope=import:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

🔴 Senior Level

Каноническая архитектура кастомного стартера: Двухмодульный паттерн

По официальному гайду разработки Spring Boot промышленный стартер должен разделяться на два модуля:

                       ┌───────────────────────────────────────────────┐
                       │          mycompany-spring-boot-starter        │
                       │           (Пустой «зонтичный» артефакт)       │
                       └───────────────────────┬───────────────────────┘
                                               │ транзитивно тянет
                                               ▼
         ┌─────────────────────────────────────┴─────────────────────────────────────┐
         ▼                                                                           ▼
┌─────────────────────────────────┐                         ┌─────────────────────────────────┐
│ mycompany-spring-boot-          │                         │          mycompany-core         │
│ autoconfigure                   │                         │  (Чистый Java SDK/клиент        │
│ (Автоконфигурация, условия,      │                         │   без привязки к Spring Boot)   │
│  @AutoConfiguration, BPP)       │                         └─────────────────────────────────┘
└─────────────────────────────────┘
  1. mycompany-core: бизнес-библиотека (SDK, клиенты сетевых протоколов, вспомогательные классы). Она не должна зависеть от Spring Boot, чтобы ее могли использовать разработчики классических Java/Kotlin-приложений.
  2. mycompany-spring-boot-autoconfigure: содержит классы автоконфигурации (@AutoConfiguration), классы свойств (@ConfigurationProperties) и условные аннотации (@ConditionalOnClass).
  3. mycompany-spring-boot-starter: пустой POM-модуль, который просто объединяет зависимости на core и autoconfigure. Именно его подключает конечный пользователь.

Реализация автоконфигурации в Spring Boot 3.x

  1. Класс свойств конфигурации: ```java package com.mycompany.starter.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = “mycompany.client”) public class MyCompanyProperties { private String apiKey; private int timeoutMs = 3000; private boolean enabled = true;

// геттеры и сеттеры
public String getApiKey() { return apiKey; }
public void setApiKey(String apiKey) { this.apiKey = apiKey; }
public int getTimeoutMs() { return timeoutMs; }
public void setTimeoutMs(int timeoutMs) { this.timeoutMs = timeoutMs; }
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; } } ```
  1. Класс автоконфигурации (@AutoConfiguration): ```java package com.mycompany.starter.autoconfigure;

import com.mycompany.core.MyClient; import com.mycompany.starter.properties.MyCompanyProperties; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean;

@AutoConfiguration @ConditionalOnClass(MyClient.class) @EnableConfigurationProperties(MyCompanyProperties.class) @ConditionalOnProperty(prefix = “mycompany.client”, name = “enabled”, havingValue = “true”, matchIfMissing = true) public class MyCompanyAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public MyClient myClient(MyCompanyProperties properties) {
    return new MyClient(properties.getApiKey(), properties.getTimeoutMs());
} } ```
  1. Регистрация в реестре Spring Boot 3: Создается файл src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:
    com.mycompany.starter.autoconfigure.MyCompanyAutoConfiguration
    

Генерация метаданных для IDE автодополнения

Чтобы в файлах application.yml конечных пользователей работало автодополнение свойств стартера (с описаниями и подсказками типов), в модуль автоконфигурации подключают процессор аннотаций:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Во время компиляции процессор генерирует файл META-INF/spring-configuration-metadata.json, который распознается IntelliJ IDEA и VS Code.


🎯 Шпаргалка для интервью

30-секундный ответ

Starter в Spring Boot — это агрегирующий модуль зависимостей, решающий проблему сборки и совместимости библиотек для конкретной задачи (Web, JPA, Security).

  • Устраняет проблему Jar Hell за счет синхронизации версий через BOM (spring-boot-dependencies).
  • Включает в себя набор транзитивных библиотек и модуль автоконфигурации (*-autoconfigure).
  • Именование: официальные стартеры именуются строго spring-boot-starter-*, а сторонние и корпоративные — *-spring-boot-starter.
  • По каноническому стандарту стартер строится по двухмодульному паттерну: чистый Java-клиент + модуль автоконфигурации с регистрацией в .imports-файле.

4 каверзных вопроса с ответами

  1. Почему промышленный стартер рекомендуется делить на два модуля (autoconfigure и starter)? Ответ: Модуль autoconfigure содержит все бины, аннотации и условия Spring Boot. Модуль starter — это пустой артефакт, объединяющий зависимости. Такое разделение позволяет подключать модуль базовой библиотеки (core) в проекты, где не используется Spring Boot (например, микросервисы на Micronaut, Quarkus или обычные консольные утилиты), не принуждая их тянуть транзитивные зависимости Spring.

  2. Как использовать управление версиями Spring Boot, если проект не может наследоваться от spring-boot-starter-parent? Ответ: Через секцию <dependencyManagement> в pom.xml, импортировав артефакт spring-boot-dependencies с атрибутами <type>pom</type> и <scope>import</scope>. Это позволяет переопределить родительский POM на корпоративный, сохранив управление версиями Spring Boot.

  3. Почему официальные стартеры называются spring-boot-starter-*, а сторонние *-spring-boot-starter? Ответ: Это жесткое соглашение об именовании Spring Boot. Префикс spring-boot-starter-* зарезервирован для официальной команды Spring Framework / VMware. Сторонние библиотеки (например, mybatis-spring-boot-starter, camel-spring-boot-starter) обязаны использовать постфикс, чтобы пользователи легко отличали официальные компоненты экосистемы от сторонних.

  4. Зачем в стартер подключают spring-boot-configuration-processor? Ответ: Этот аннотационный процессор анализирует классы с @ConfigurationProperties во время компиляции и генерирует JSON-манифест META-INF/spring-configuration-metadata.json. На основе этого файла IDE (IntelliJ IDEA, Eclipse) обеспечивают подсветку, проверку типов и автодополнение параметров стартера в application.properties и application.yml.

Красные флаги (чего категорически нельзя говорить)

  • ❌ «Стартер — это обычный JAR-файл, содержащий только скомпилированные классы логики» — стартер в первую очередь агрегирует зависимости и запускает автоконфигурацию.
  • ❌ «В своем проекте можно назвать стартер spring-boot-starter-mycompany» — нарушение соглашения об именовании; имя должно быть mycompany-spring-boot-starter.
  • ❌ «Стартеры жестко привязывают номера версий к каждой транзитивной библиотеке внутри pom.xml проекта» — версиями управляет централизованный BOM (spring-boot-dependencies).
  • ❌ «В Spring Boot 3 для регистрации стартера все еще используется spring.factories» — в Boot 3.x автоконфигурации регистрируются в файле META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.

Связанные темы