Какие механизмы автоконфигурации есть в Spring
Что проверяют
Понимаете ли вы, что Spring Boot делает за вас, и умеете ли вы это переопределить. Вопрос отделяет тех, кто добавляет стартеры наугад, от тех, кто может объяснить, откуда взялся конкретный бин.
Как отвечать
Автоконфигурация это набор готовых конфигураций, которые применяются в зависимости от того, что лежит в classpath и что уже определено в контексте. Механика держится на нескольких вещах:
@SpringBootApplicationвключает в себя@EnableAutoConfiguration, с которой всё и начинается;- реестр кандидатов: раньше это был
META-INF/spring.factories, начиная со Spring Boot 2.7 и 3.x список лежит вMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. Оттуда Spring берёт классы-кандидаты; - условные аннотации решают, применить кандидата или пропустить:
@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty,@ConditionalOnWebApplication. Ключевая из них@ConditionalOnMissingBean: ваш собственный бин побеждает автоконфигурацию, поэтому переопределение работает само собой; - порядок:
@AutoConfigureBefore,@AutoConfigureAfterи@AutoConfigureOrder, когда одна конфигурация обязана увидеть результат другой; - свойства: классы
@ConfigurationPropertiesсвязываютapplication.ymlс настройками, поэтому в большинстве случаев менять код не нужно вовсе.
Пример на пальцах: добавили spring-boot-starter-web, в classpath появились сервлеты и Spring MVC, и автоконфигурация подняла встроенный Tomcat, DispatcherServlet и конвертеры JSON. Объявили свой ObjectMapper, и настройка сериализации переходит к вам.
Где спотыкаются
Не знают, как посмотреть, что именно сработало. Запуск с --debug печатает отчёт с двумя списками, применённые и отклонённые конфигурации с причиной.
Путают @Configuration и автоконфигурацию: первая ваша и применяется всегда, вторая библиотечная и условная.
Пытаются отключить лишнее удалением стартера. Точнее это делается через @SpringBootApplication(exclude = ...) или свойство spring.autoconfigure.exclude.