← Назад к вопросам

Что случится при запуске приложения с аннотациями @SpringBootApplication и @EnableAfterConfiguration?

2.0 Middle🔥 191 комментариев
#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@SpringBootApplication и @EnableAutoConfiguration

Что такое @SpringBootApplication

@SpringBootApplication — это метааннотация, которая объединяет три важные аннотации:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

// Эквивалентно:
@SpringBootConfiguration  // Включает @Configuration
@EnableAutoConfiguration  // Включает автоконфигурацию
@ComponentScan            // Сканирует компоненты
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Эти три компонента работают вместе:

  • @SpringBootConfiguration (наследует @Configuration) — указывает, что класс содержит бины и конфигурацию Spring
  • @EnableAutoConfiguration — автоматически конфигурирует Spring приложение на основе зависимостей в classpath
  • @ComponentScan — сканирует и регистрирует компоненты, аннотированные @Component, @Service, @Repository и т.д.

Что происходит при запуске приложения

Когда вы запускаете приложение с @SpringBootApplication:

  1. Инициализация ApplicationContext — создаётся контекст Spring
  2. Автоконфигурация — Spring анализирует classpath и загружает конфигурации из META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  3. Сканирование компонентов — сканируются классы в том же пакете и подпакетах
  4. Создание бинов — создаются и инициализируются все бины
  5. Запуск приложения — вызываются Application Listeners и логика приложения

Процесс автоконфигурации подробно

// Пример: как работает @EnableAutoConfiguration
// Spring ищет META-INF/spring.factories (в старых версиях)
// или META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

// Типичная автоконфигурация для Web приложения:
@AutoConfiguration
@ConditionalOnClass(HttpServletRequest.class)
public class WebAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public ViewResolver viewResolver() {
        // Если нет пользовательского ViewResolver, создаём его
        return new InternalResourceViewResolver();
    }
    
    @Bean
    @ConditionalOnMissingBean
    public DispatcherServlet dispatcherServlet(ApplicationContext context) {
        return new DispatcherServlet(context);
    }
}

Порядок инициализации

  1. Чтение properties — загружаются application.properties/yml
  2. Создание ApplicationContext — стандартный контекст Spring
  3. Регистрация бинов из автоконфигураций — на основе условий (@ConditionalOnClass, @ConditionalOnMissingBean и т.д.)
  4. Сканирование компонентов — @ComponentScan в пакетах приложения
  5. Инициализация ApplicationContext — вызов refresh() и всех listeners
  6. Завершение инициализации — готовность приложения

Практический пример

@SpringBootApplication
public class EcommerceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EcommerceApplication.class, args);
    }
}

// При запуске приложения Spring автоматически:
// 1. Настроит встроенный Tomcat (если spring-boot-starter-web в зависимостях)
// 2. Конфигурирует DataSource (если spring-boot-starter-data-jpa в зависимостях)
// 3. Сканирует и регистрирует все @Service, @Repository, @Controller в пакетах
// 4. Конфигурирует логирование
// 5. Запускает встроенный сервер

@Service
public class UserService {
    // Автоматически создан как бин и готов к использованию
}

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService; // Автоматически внедрён
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}

Условная автоконфигурация

Автоконфигурации используют условия для включения/отключения конфигураций:

// Пример из Spring Boot
@AutoConfiguration
@ConditionalOnClass(DataSource.class)  // Конфигурируется только если DataSource в classpath
@ConditionalOnProperty(name = "spring.datasource.url")  // Только если свойство установлено
public class DataSourceAutoConfiguration {
    // ...
}

Отключение автоконфигурации

Если вам нужна полная контроль, вы можете отключить автоконфигурацию:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyApplication {
    // DataSource не будет автоматически конфигурирован
}

// Или в application.properties:
// spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Итоговый результат

При запуске приложения с @SpringBootApplication:

  • Web приложение готово обрабатывать HTTP запросы
  • Все бины созданы и готовы к использованию
  • Логирование настроено
  • Конфигурация загружена из properties файлов
  • Встроенный сервер (обычно Tomcat) запущен на порту 8080 (по умолчанию)

Это мощный механизм, который позволяет создать Production-ready приложение минимальным количеством кода.