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