Питання 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 створює proxy]]
  • [[17. Що робить анотація @Transactional]]