← Назад к вопросам
Что случится при запуске приложения с аннотациями @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:
- Инициализация ApplicationContext — создаётся контекст Spring
- Автоконфигурация — Spring анализирует classpath и загружает конфигурации из
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - Сканирование компонентов — сканируются классы в том же пакете и подпакетах
- Создание бинов — создаются и инициализируются все бины
- Запуск приложения — вызываются 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);
}
}
Порядок инициализации
- Чтение properties — загружаются application.properties/yml
- Создание ApplicationContext — стандартный контекст Spring
- Регистрация бинов из автоконфигураций — на основе условий (@ConditionalOnClass, @ConditionalOnMissingBean и т.д.)
- Сканирование компонентов — @ComponentScan в пакетах приложения
- Инициализация ApplicationContext — вызов refresh() и всех listeners
- Завершение инициализации — готовность приложения
Практический пример
@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 приложение минимальным количеством кода.