Как создать свой Spring Boot стартер для агрегации логики микросервисов
Что проверяют
Понимаете ли вы, как работает автоконфигурация, а не только умеете подключать чужие стартеры. Отдельно смотрят на границы: что в стартер класть можно, а что превратит микросервисы в распределённый монолит. Следом спрашивают, как пользователь стартера переопределит ваш бин.
Как отвечать
Стартер состоит из двух частей, их часто держат отдельными модулями:
- autoconfigure-модуль: классы с
@AutoConfigurationи бины под условиями; - starter-модуль: пустой артефакт, который тянет autoconfigure и нужные зависимости. Называют его вроде
acme-spring-boot-starter, начинать имя сspring-bootдокументация запрещает.
В Spring Boot 3 и новее автоконфигурация регистрируется в файле META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, по одному классу на строку. Ключ автоконфигурации в spring.factories с 3.0 не читается.
Условия, без которых стартер вредит:
@ConditionalOnMissingBean: если приложение объявило свой бин, ваш не создаётся;@ConditionalOnClass: конфигурация включается, только если нужная библиотека есть на classpath;@ConditionalOnProperty: выключатель черезapplication.yml.
Настройки выносятся в класс с @ConfigurationProperties, а spring-boot-configuration-processor генерирует метаданные для подсказок в IDE. Тестируется автоконфигурация через ApplicationContextRunner: поднимаете маленький контекст и проверяете, какой бин появился при каких свойствах.
В стартер уместно выносить сквозные вещи: единый формат ошибок, трассировку, логирование запросов, настройку HTTP-клиентов и метрики.
Где спотыкаются
Регистрируют автоконфигурацию через spring.factories по старым статьям. На Spring Boot 3 она молча не подхватывается, и бины просто не появляются.
Ставят на конфигурацию @ComponentScan или создают бины без условий. Пользователь не может заменить ваш бин своим и ловит конфликт двух бинов одного типа.
Кладут в стартер бизнес-логику сервисов. Любое изменение тогда требует пересборки всех микросервисов разом, и независимый деплой, ради которого их делили, пропадает. Версии зависимостей при этом лучше брать из BOM Spring Boot, а не прописывать жёстко.