Что такое 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) │ └─────────────────────────────────┘
└─────────────────────────────────┘
mycompany-core: бизнес-библиотека (SDK, клиенты сетевых протоколов, вспомогательные классы). Она не должна зависеть от Spring Boot, чтобы ее могли использовать разработчики классических Java/Kotlin-приложений.mycompany-spring-boot-autoconfigure: содержит классы автоконфигурации (@AutoConfiguration), классы свойств (@ConfigurationProperties) и условные аннотации (@ConditionalOnClass).mycompany-spring-boot-starter: пустой POM-модуль, который просто объединяет зависимости наcoreиautoconfigure. Именно его подключает конечный пользователь.
Реализация автоконфигурации в Spring Boot 3.x
- Класс свойств конфигурации: ```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; } } ```
- Класс автоконфигурации (
@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());
} } ```
- Регистрация в реестре 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 каверзных вопроса с ответами
-
Почему промышленный стартер рекомендуется делить на два модуля (
autoconfigureиstarter)? Ответ: Модульautoconfigureсодержит все бины, аннотации и условия Spring Boot. Модульstarter— это пустой артефакт, объединяющий зависимости. Такое разделение позволяет подключать модуль базовой библиотеки (core) в проекты, где не используется Spring Boot (например, микросервисы на Micronaut, Quarkus или обычные консольные утилиты), не принуждая их тянуть транзитивные зависимости Spring. -
Как использовать управление версиями Spring Boot, если проект не может наследоваться от
spring-boot-starter-parent? Ответ: Через секцию<dependencyManagement>вpom.xml, импортировав артефактspring-boot-dependenciesс атрибутами<type>pom</type>и<scope>import</scope>. Это позволяет переопределить родительский POM на корпоративный, сохранив управление версиями Spring Boot. -
Почему официальные стартеры называются
spring-boot-starter-*, а сторонние*-spring-boot-starter? Ответ: Это жесткое соглашение об именовании Spring Boot. Префиксspring-boot-starter-*зарезервирован для официальной команды Spring Framework / VMware. Сторонние библиотеки (например,mybatis-spring-boot-starter,camel-spring-boot-starter) обязаны использовать постфикс, чтобы пользователи легко отличали официальные компоненты экосистемы от сторонних. -
Зачем в стартер подключают
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.