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

Ответ

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.

Ответ 18+ 🔞

Слушай, а давай я тебе на пальцах объясню, что это за зверь такой — Spring Boot Starter. Представь, что ты, блядь, каждый раз собираешь походный набор: вот тебе палатка, вот спальник, вот горелка. А тут приходит какой-то умник и говорит: «На, мудила, вот тебе один рюкзак, в нём уже всё упаковано, даже спички сухие лежат». Вот этот рюкзак — он и есть стартер, ёпта!

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

А зачем свой городить? Ну, допустим, ты написал какую-нибудь офигенную библиотеку для отправки сообщений голубиной почтой. И хочешь, чтобы другие ленивые жопы могли подключить её одной строчкой в pom.xml, а не вручную прописывать десять зависимостей и конфигурационный файл с ритуальными плясками.

Как слепить свой стартер, не облажавшись

Обычно это делают в двух модулях, чтобы не превратить всё в одно большое месиво.

  1. Модуль autoconfigure (мозги и настройки). Здесь живёт вся магия. Ты создаёшь класс, который говорит Спрингу: «Э, сабака сука, если видишь в classpath мой сервис — создавай его бин, вот по таким правилам».

    @Configuration
    @ConditionalOnClass(MyService.class) // Сработает, только если мой сервис доступен
    @EnableConfigurationProperties(MyProperties.class) // Подтягиваем настройки из application.yml
    public class MyAutoConfiguration {
        @Bean
        @ConditionalOnMissingBean // Создадим бин, только если его ещё никто не создал
        public MyService myService(MyProperties properties) {
            return new MyService(properties); // Вот он, наш красавец
        }
    }

    Главный фокус — нужно зарегистрировать эту автоконфигурацию. Раньше для этого был файл spring.factories, а теперь (с Spring Boot 2.7+) нужно создать файлик: src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports И просто написать в нём полное имя класса нашей конфигурации: com.example.my.starter.MyAutoConfiguration

    А ещё, чтобы в application.properties подсказки были, как у взрослых, можно добавить spring-configuration-metadata.json. Это уже высший пилотаж, для особо одарённых.

  2. Модуль starter (пустышка-сборщик). Это, по сути, пустой проект. Его единственная работа — собрать в кучу все нужные зависимости. В его pom.xml ты просто объявляешь зависимость на наш autoconfigure и, если надо, на другие библиотеки, без которых твой стартер — просто пшик.

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-awesome-autoconfigure</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- Сюда можно добавить другие обязательные либы -->
    </dependencies>

И что в итоге? Пользователь, которому надоело всё делать руками, просто добавляет в свой проект зависимость на твой starter. И всё, блядь! Больше он ни о чём не думает. Автоконфигурация сама подхватится, бины создадутся, и его голуби уже летят с сообщениями. Красота, ёперный театр!