Что такое Spring Boot Starter и как создать собственный?

«Что такое Spring Boot Starter и как создать собственный?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. pom.xml с необходимыми транзитивными зависимостями.
  2. Классы автоматической конфигурации (@Configuration).
  3. Файл spring.factories / META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (для Spring Boot 2.7+) для регистрации автоконфигураций.

Зачем создавать свой Starter? Для централизованного и удобного подключения вашей библиотеки или модуля в другие Spring Boot приложения.

Шаги создания собственного Starter:

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

    • autoconfigure — содержит логику автоконфигурации, аннотации, @ConfigurationProperties.
    • starter — пустой POM-модуль, который зависит от autoconfigure и всех необходимых библиотек.
  2. В модуле autoconfigure:

    • Создайте класс автоконфигурации с аннотациями @Configuration и @ConditionalOnClass / @ConditionalOnProperty.
      @Configuration
      @ConditionalOnClass(MyService.class)
      @EnableConfigurationProperties(MyProperties.class)
      public class MyAutoConfiguration {
      @Bean
      @ConditionalOnMissingBean
      public MyService myService(MyProperties properties) {
          return new MyService(properties);
      }
      }
    • Зарегистрируйте его в файле src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (одна строка с полным именем класса).
    • Добавьте файл spring-configuration-metadata.json для поддержки подсказок в application.properties.
  3. В модуле starter:

    • Укажите зависимость на autoconfigure и другие необходимые библиотеки в pom.xml.

Теперь пользователи могут подключить ваш функционал, добавив одну зависимость на ваш starter.