Получить доступ

Spring Boot: автоконфигурация и starters

@SpringBootApplication и starters, механизм автоконфигурации по условиям, переопределение через @ConditionalOnMissingBean, внешняя конфигурация и её приоритеты.

@SpringBootApplication и запуск

@SpringBootApplication — это мета-аннотация, объединяющая три: @SpringBootConfiguration (вариант @Configuration), @EnableAutoConfiguration (включает автоконфигурацию) и @ComponentScan (сканирует пакет приложения и ниже).

SpringApplication.run поднимает ApplicationContext, запускает встроенный сервер и применяет автоконфигурацию. Философия Boot — convention over configuration: разумные умолчания из коробки, которые при необходимости переопределяются.

Starters и версии зависимостей

Starter (spring-boot-starter-web, -data-jpa, -security…) — это курируемый набор согласованных зависимостей под задачу: подключив один, вы получаете все нужные библиотеки совместимых версий.

Версии при этом не указывают вручную — ими управляет Spring Boot BOM (dependency management). Это убирает «ад зависимостей» и несовместимости версий, типичные для ручной сборки classpath.

Механизм автоконфигурации

@EnableAutoConfiguration загружает список классов-автоконфигураций из META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (в старых версиях — из spring.factories). Каждая автоконфигурация — это обычный @Configuration, обвешанный условиями: @ConditionalOnClass (нужный класс есть на classpath), @ConditionalOnMissingBean, @ConditionalOnProperty.

Логика проста и предсказуема: «если на classpath есть, например, H2 и Spring JDBC, а пользователь сам не настроил DataSource — настройте его за него». Никакой магии: всё это обычные бины под условиями.

Переопределение умолчаний

Ключ к управляемости — @ConditionalOnMissingBean: автоконфигурация создаёт бин ТОЛЬКО если такого бина ещё нет. Поэтому, объявив свой бин (например, собственный ObjectMapper или DataSource), вы автоматически замещаете дефолт Boot — без отключения чего-либо.

Если нужно убрать конкретную автоконфигурацию целиком — её исключают через @SpringBootApplication(exclude = ...). Так «convention over configuration» остаётся под контролем.

Внешняя конфигурация и приоритеты

Настройки задают в application.yml/properties, а читают точечно через @Value("${...}") или, предпочтительно, типобезопасно через @ConfigurationProperties (группа свойств в объект, с валидацией и relaxed binding: APP_NAME, app.name, app-name связываются с одним полем).

Источники свойств имеют приоритет (от высшего к низшему, упрощённо): аргументы командной строки → переменные окружения → application-{profile} → application. Профили (@Profile, spring.profiles.active) переключают наборы бинов и файлы application-{profile}.yml под dev/test/prod без правки кода.

@ConfigurationProperties(prefix = "app")
record AppProps(String name, int retries) {} // app.name, app.retries из yml

Отладка автоконфигурации

Когда непонятно, почему бин появился или нет, запускают с флагом --debug (или свойством debug=true): Boot печатает ConditionsEvaluationReport — какие автоконфигурации применились (positive matches) и какие отклонены и по какому условию (negative matches).

Это превращает «магию» в читаемый отчёт и снимает большинство вопросов «откуда взялся этот бин».

Как отвечать на собеседовании

Разложите @SpringBootApplication на три аннотации, объясните starters + BOM (согласованные версии). Главное — механизм автоконфигурации: список из AutoConfiguration.imports + @ConditionalOnClass/OnMissingBean/OnProperty, и переопределение через @ConditionalOnMissingBean (свой бин замещает дефолт). Добавьте приоритеты источников конфигурации и @ConfigurationProperties с relaxed binding, и упомяните --debug/ConditionsEvaluationReport.

Вопросы по теме

Читайте также

Закрытая бета

Знать тему — половина дела

На живом собеседовании sotto слышит вопрос интервьюера и показывает короткий ответ и план. Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем