← Назад к вопросам

Как написать свой Starter

2.4 Senior🔥 21 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Создание собственного Spring Boot Starter

Spring Boot Starter — это Maven модуль, который упрощает конфигурацию и интеграцию зависимостей. Вот полный гайд по созданию собственного стартера.

1. Структура проекта

Создайте два модуля:

  • my-custom-starter-autoconfigure — логика автоконфигурации
  • my-custom-starter — POM с зависимостями (мост для пользователей)

2. Модуль автоконфигурации

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-custom-starter-autoconfigure</artifactId>
    <version>1.0.0</version>
    <name>My Custom Starter AutoConfigure</name>

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

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

Класс с конфигурацией

@ConfigurationProperties(prefix = "app.myfeature")
public class MyFeatureProperties {
    private String apiKey;
    private int timeout = 5000;
    private boolean enabled = true;

    public String getApiKey() { return apiKey; }
    public void setApiKey(String apiKey) { this.apiKey = apiKey; }
    
    public int getTimeout() { return timeout; }
    public void setTimeout(int timeout) { this.timeout = timeout; }
    
    public boolean isEnabled() { return enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }
}

Класс сервиса

public class MyFeatureService {
    private final MyFeatureProperties properties;

    public MyFeatureService(MyFeatureProperties properties) {
        this.properties = properties;
    }

    public String doSomething() {
        if (!properties.isEnabled()) {
            return "Feature disabled";
        }
        return "Doing something with API key: " + properties.getApiKey();
    }
}

Автоконфигурация

@Configuration
@EnableConfigurationProperties(MyFeatureProperties.class)
@ConditionalOnClass(MyFeatureService.class)
@ConditionalOnProperty(
    name = "app.myfeature.enabled",
    havingValue = "true",
    matchIfMissing = true
)
public class MyFeatureAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyFeatureService myFeatureService(MyFeatureProperties properties) {
        return new MyFeatureService(properties);
    }
}

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Создайте файл src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:

com.example.MyFeatureAutoConfiguration

Для Spring Boot < 3.0 используйте META-INF/spring.factories:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyFeatureAutoConfiguration

3. Модуль стартера

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-custom-starter</artifactId>
    <version>1.0.0</version>
    <name>My Custom Starter</name>
    <description>Custom Spring Boot Starter</description>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-custom-starter-autoconfigure</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

4. Использование стартера

Добавьте зависимость в приложение:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-custom-starter</artifactId>
    <version>1.0.0</version>
</dependency>

В application.yml или application.properties:

app:
  myfeature:
    enabled: true
    apiKey: your-secret-key
    timeout: 3000

Используйте сервис в приложении:

@RestController
public class MyController {
    private final MyFeatureService myFeatureService;

    public MyController(MyFeatureService myFeatureService) {
        this.myFeatureService = myFeatureService;
    }

    @GetMapping("/test")
    public String test() {
        return myFeatureService.doSomething();
    }
}

5. Аннотации для автоконфигурации

Частые условия:

  • @ConditionalOnClass — если класс в classpath
  • @ConditionalOnMissingBean — если bean не зарегистрирован
  • @ConditionalOnProperty — если свойство установлено
  • @ConditionalOnWebApplication — только для веб-приложений
  • @AutoConfigureAfter — порядок загрузки

6. Публикация

Для публикации на Maven Central:

mvn clean deploy

Или локально:

mvn clean install

Полезные рекомендации

  • Давайте осмысленные имена: spring-boot-starter-*
  • Избегайте конфликтов с Official стартерами
  • Документируйте свойства конфигурации
  • Предоставляйте разумные defaults
  • Используйте условные аннотации для гибкости
  • Создавайте тесты для автоконфигурации

Вот и всё! Свой Starter готов к использованию в других проектах.

Как написать свой Starter | PrepBro