Що таке стартер в 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.