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

Сегодня поговорим о 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. Записаться можно бесплатно по ссылке.

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