Как создать кастомный Starter для Spring Boot

—

от автора

Привет, Хабр!

Сегодня поговорим о Spring Boot Starter’ах. Зачем они нужны? Когда проект разрастается до десятков микросервисов, вы сталкиваетесь с тем, что:

  • Код дублируется: один и тот же логгер, Redis или Kafka — всё настраивается вручную.

  • Отсутствие стандартизации: в одном проекте логгер пишет в /logs, в другом — прямо в консоль. Ну как так?

  • Сложность поддержки: каждый раз правка конфигурации превращается в марафон: нужно всё менять во всех микросервисах.

Здесь и приходят на помощь Spring Boot Starter’ы. Они позволяют:

  • Упрощать подключение зависимостей.

  • Автоматически конфигурировать сервисы.

  • Давать возможность гибкой настройки через application.properties.

Сегодня я покажу, как создавать кастомные Starter’ы, которые помогут сэкономить время и стандартизировать конфигурации во всех микросервисах.

Что такое Spring Boot Starter и как он работает?

Starter — это не просто библиотека. Это возможность автоматической настройки компонентов вашего приложения через автоконфигурацию. Важные моменты:

  • Автоконфигурация: класс с аннотацией @Configuration, который автоматически создаёт нужные бины.

  • Условные аннотации: такие как @ConditionalOnClass, @ConditionalOnProperty — они управляют активацией конфигурации.

  • Конфигурационные свойства: настраиваем через application.properties или application.yml.

  • Регистрация: Spring знает о вашей автоконфигурации через файл META-INF/spring.factories.

Пишем свой Starter

Предположим, в проекте используется кастомный логгер. Вместо того, чтобы настраивать его вручную в каждом микросервисе, создадим Starter, который:

  • Подключает логгер автоматически.

  • Настраивается через application.properties.

  • Работает в продакшене.

Шаг 1: минимальный pom.xml для Starter’а

<project>     <modelVersion>4.0.0</modelVersion>     <groupId>com.example</groupId>     <artifactId>custom-logger-starter</artifactId>     <version>1.0.0</version>     <packaging>jar</packaging>     <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-autoconfigure</artifactId>         </dependency>     </dependencies> </project>

Подключаем spring-boot-autoconfigure, чтобы иметь возможность создавать автоконфигурации. Starter — это обычный jar, который подключается как зависимость.

Шаг 2: пишем класс автоконфигурации

@Configuration @ConditionalOnClass(Logger.class) // Логгер будет подключаться только при наличии этого класса @EnableConfigurationProperties(LoggerProperties.class) // Подключаем свойства логгера public class LoggerAutoConfiguration {      @Bean     @ConditionalOnMissingBean // Если бин логгера уже есть, не будем его перезаписывать     public Logger customLogger(LoggerProperties properties) {         return new Logger(properties.getName(), properties.isDebug());     } }

@ConditionalOnClass(Logger.class) — логгер подключится, только если класс Logger присутствует в контексте.

@ConditionalOnMissingBean — предотвращает создание нового бина логгера, если он уже был настроен в приложении.

Шаг 3: Конфигурационные свойства

Создадим класс для конфигурации логгера, который будет настраиваться через application.properties.

@ConfigurationProperties(prefix = "custom.logger") public class LoggerProperties {     private String name = "DefaultLogger";     private boolean debug = false;      // Getters и Setters }

Теперь можно настроить логгер в application.properties:

custom.logger.name=MyAwesomeLogger custom.logger.debug=true

Шаг 4: Регистрируем автоконфигурацию

Теперь создаём файл META-INF/spring.factories, чтобы Spring Boot знал о стартере.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.logger.LoggerAutoConfiguration

Тестирование и мониторинг

После того как написали Starter, удостоверимся, что всё работает как надо. Для этого напишем тест:

@SpringBootTest(properties = "custom.logger.name=TestLogger") public class LoggerAutoConfigurationTest {      @Autowired     private Logger logger;      @Test     public void testLoggerConfiguration() {         assertEquals("TestLogger", logger.getName());     } }

Здесь проверяем, что логгер инициализируется с настройками, переданными в application.properties.

А если хочется отслеживать, как часто используется логгер, можете интегрировать его с Micrometer:

@Bean public Counter logCounter(MeterRegistry registry) {     return Counter.builder("logger.calls")                   .description("Number of log calls")                   .register(registry); }

Теперь можно мониторить количество вызовов логгера через метрики.


Заключение

Кастомные Spring Boot Starter’ы — это мощный инструмент для упрощения конфигурации в многокомпонентных проектах. С их помощью можно:

  • Стандартизировать использование общих сервисов, как логгеры или клиенты для Redis.

  • Автоматизировать конфигурацию и исключить ошибки.

  • Сделать некую гибкость настройки через application.properties.

Если у вас есть опыт работы с Starter’ами или свои советы — делитесь в комментариях.

А 23 января в Otus пройдет открытый урок «OpenAPI + Spring». На нём участники рассмотрят, как OpenAPI спецификация и связанные с ней инструменты могут помочь при решении типовых задач веб-разработки на Spring. Записаться можно бесплатно по ссылке.


ссылка на оригинал статьи https://habr.com/ru/articles/874808/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *