Вопрос 20 · Раздел 5

Что такое автоконфигурация в Spring Boot?

4. --debug → отладка конфигурации 5. Порядок → After/Before аннотации 6. Boot 3.x → новый формат .imports

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Автоконфигурация — Spring Boot сам настраивает бины, глядя на то, что есть в classpath.

Простая аналогия: Умный дом. Вы входите в комнату — свет включается сам. Вам не нужно нажимать выключатель.

// Без Spring Boot:
@Bean
public DataSource dataSource() {
    // Ручная настройка...
}

// С Spring Boot:
// Просто добавьте зависимость в pom.xml:
// <dependency>spring-boot-starter-data-jpa</dependency>
// → DataSource создастся автоматически!

Как отключить:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

🟡 Middle Level

Как работает

@SpringBootApplication
  → @EnableAutoConfiguration
    → AutoConfigurationImportSelector
      → Читает spring.factories (Boot 2.x)
      → или .imports (Boot 3.x)
        → Загружает автоконфигурации

@Conditional аннотации

@ConditionalOnClass(DataSource.class)  // Если есть класс
@ConditionalOnMissingBean              // Если нет такого бина
@ConditionalOnProperty("app.enabled")  // Если свойство true
@ConditionalOnWebApplication           // Если web приложение

Пример автоконфигурации

@Configuration
@ConditionalOnClass(ObjectMapper.class)  // Если есть Jackson
@ConditionalOnMissingBean(ObjectMapper.class)  // Если вы не создали свой
public class JacksonAutoConfiguration {
    
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        return new ObjectMapper();  // Создаёт дефолтный
    }
}

Отладка

# Запуск с отчётом:
java -jar app.jar --debug

# Вывод: Condition Evaluation Report
# → Показывает, почему каждый бин создался или нет

🔴 Senior Level

Spring Boot 2.x vs 3.x

Boot 2.x:
  → META-INF/spring.factories
  → Ключ: EnableAutoConfiguration
  → Эти файлы содержат список классов автоконфигурации (полные имена классов), по одному на строку. Spring Boot читает их при старте и регистрирует указанные бины.

Boot 3.x:
  → META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  → Просто список классов
  → Быстрее, поддержка GraalVM Native

Порядок загрузки

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@AutoConfigureBefore(HibernateJpaAutoConfiguration.class)
public class MyAutoConfiguration { }

// → Критично для зависимостей между конфигурациями!

Создание своей автоконфигурации

// В отдельном модуле: mylib-autoconfigure
@AutoConfiguration
@ConditionalOnClass(MyService.class)
public class MyLibAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

// В META-INF/spring/...AutoConfiguration.imports:
com.example.MyLibAutoConfiguration

Production Experience

Реальный сценарий: медленный старт

Большое количество автоконфигураций увеличивает время старта.
Исключение ненужных через exclude и ограничение сканирования пакетов может сократить старт на 20-40%.

Best Practices

  1. @ConditionalOnMissingBean → позволяйте переопределять
  2. @AutoConfiguration (Spring Boot 2.7+: замена @Configuration для автоконфигурации. Для Boot 3.x используйте .imports файл, для Boot 2.x — spring.factories).
  3. exclude → отключайте ненужные
  4. –debug → отладка конфигурации
  5. Порядок → After/Before аннотации
  6. Boot 3.x → новый формат .imports

Резюме для Senior

  • Автоконфигурация = Convention over Configuration
  • @Conditional → проверка условий
  • Boot 3.x → .imports вместо spring.factories
  • Порядок → критичен для зависимостей
  • Своя автоконфигурация → отдельный модуль
  • –debug → Condition Evaluation Report

🎯 Шпаргалка для интервью

Обязательно знать:

  • Автоконфигурация = Convention over Configuration: Spring Boot сам настраивает бины по classpath
  • @SpringBootApplication → @EnableAutoConfiguration → AutoConfigurationImportSelector
  • Boot 2.x читает META-INF/spring.factories, Boot 3.x → META-INF/spring/…AutoConfiguration.imports
  • @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty — ключевые условные аннотации
  • @ConditionalOnMissingBean позволяет переопределить бин своей конфигурацией
  • Порядок: @AutoConfigureAfter / @AutoConfigureBefore для зависимостей между конфигурациями
  • Отключить: @SpringBootApplication(exclude = {…})
  • Отладка: –debug → Condition Evaluation Report
  • Своя автоконфигурация — отдельный модуль с .imports файлом

Частые уточняющие вопросы:

  • Как Spring Boot узнаёт, что сконфигурировать? → Сканирует classpath, читает .imports/spring.factories, проверяет @Conditional
  • Чем Boot 3.x отличается от 2.x? → .imports файл вместо spring.factories, быстрее, поддержка GraalVM Native
  • Как переопределить автоконфигурацию? → Создать свой @Bean того же типа — @ConditionalOnMissingBean не создаст дефолтный
  • Как узнать, почему бин НЕ создался? → Запустить с –debug, смотреть Condition Evaluation Report

Красные флаги (НЕ говорить):

  • «Автоконфигурация создаёт все бины всегда» — только если условия @Conditional выполнены
  • «spring.factories используется в Boot 3.x» — заменён на .imports
  • «@ConditionalOnMissingBean проверяет classpath» — проверяет наличие бина в контексте
  • «Автоконфигурация замедляет приложение в рантайме» — влияет только на старт, не на runtime

Связанные темы:

  • [[11. Какие scope существуют в Spring]]
  • [[14. Когда Spring создаёт прокси]]
  • [[17. Что делает аннотация @Transactional]]