В чем разница между библиотекой и Spring стартером
Что проверяют
Знаете ли вы, что происходит после добавления стартера в pom.xml, или для вас это «магия Spring Boot». Следом обычно просят рассказать, как устроена автоконфигурация и как написать свой стартер.
Как отвечать
Библиотека это код с API: Jackson, Apache HttpClient, драйвер PostgreSQL. Вы подключаете её и сами создаёте объекты, настраиваете их и регистрируете бины. Про Spring она ничего не знает.
Стартер обычно вообще не содержит кода. Это набор зависимостей под одну задачу, который опирается на автоконфигурацию. spring-boot-starter-data-jpa приносит Hibernate, Spring Data JPA, JDBC и пул HikariCP, причём версии согласованы через BOM spring-boot-dependencies, и прописывать их руками не нужно.
Сама настройка живёт в автоконфигурации:
- классы с
@AutoConfiguration: Spring Boot 3 находит их по списку вMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, старый путь черезspring.factoriesдля автоконфигурации больше не работает; - условия:
@ConditionalOnClassвключает конфигурацию, только если нужный класс есть в classpath,@ConditionalOnMissingBeanотступает, если вы объявили свой бин,@ConditionalOnPropertyсмотрит на настройку; - свойства:
@ConfigurationPropertiesсвязывает параметры изapplication.ymlс объектом, поэтому адрес базы и размер пула задаются конфигом, а не кодом.
Свой стартер делают из двух модулей: acme-spring-boot-autoconfigure с конфигурацией и пустой acme-spring-boot-starter, который тянет его вместе с нужными библиотеками. Имена вида spring-boot-starter-* зарезервированы за самим Spring Boot.
Где спотыкаются
Называют стартер «той же библиотекой, только от Spring». Разница как раз в том, что стартер почти пустой, а работу делают транзитивные зависимости и условия автоконфигурации.
Не знают, как выяснить, почему бин не создался. Запуск с --debug печатает отчёт по условиям, а в Actuator для этого есть /actuator/conditions.
Переопределяют версию библиотеки из стартера отдельной строкой в зависимостях и получают несовместимый набор. Версии правят через свойства, которые объявляет BOM Spring Boot, чтобы согласованность не ломалась.