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