Ответ
Spring Boot использует механизм автоконфигурации, который автоматически настраивает бины на основе classpath и свойств приложения. Процесс обнаружения:
1. Сканирование classpath
При старте приложение проверяет наличие ключевых классов (например, DataSource.class, JpaRepository.class).
2. Загрузка конфигураций из META-INF/spring/
Основной источник — файл org.springframework.boot.autoconfigure.AutoConfiguration.imports (в Spring Boot 2.7+). В более старых версиях использовался spring.factories.
Пример содержимого AutoConfiguration.imports:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
3. Условная загрузка с @Conditional аннотациями
Каждый класс автоконфигурации активируется только при выполнении условий.
@Configuration
// Конфигурация загрузится, только если в classpath есть DataSource и H2 Database
@ConditionalOnClass({ DataSource.class, org.h2.Driver.class })
@ConditionalOnProperty(name = "spring.datasource.url")
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean // Создаст бин, только если его ещё нет в контексте
public DataSource dataSource() {
// Автоматическая настройка DataSource
}
}
Почему это работает? Стартеры (например, spring-boot-starter-data-jpa) содержат файл AutoConfiguration.imports, который указывает Spring Boot, какие классы конфигурации следует оценить и применить. Это избавляет разработчика от ручной настройки.