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

Где хранятся автоматические настройки в Spring Boot?

1.0 Junior🔥 171 комментариев
#Spring Boot и Spring Data

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

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

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

Где хранятся автоматические настройки в Spring Boot?

Автоматические настройки (AutoConfiguration) в Spring Boot хранятся в файле META-INF/spring.factories или META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (в зависимости от версии Spring Boot). Это ключевая механика, которая делает Spring Boot таким удобным.

Основное место хранения

// Spring Boot 2.x (по-прежнему поддерживается):
// File: META-INF/spring.factories
// Example:
// org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
//   com.example.MyAutoConfiguration,\
//   com.example.AnotherAutoConfiguration

// Spring Boot 3.0+ (новый подход):
// File: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
// Example:
// com.example.MyAutoConfiguration
// com.example.AnotherAutoConfiguration

Структура проекта Spring Boot

spring-boot-starter-web
├── META-INF/
│   └── spring/
│       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│           (содержит список классов AutoConfiguration)
└── src/main/java/org/springframework/boot/autoconfigure/
    ├── web/
    │   ├── servlet/
    │   │   └── DispatcherServletAutoConfiguration.java
    │   └── reactive/
    │       └── WebFluxAutoConfiguration.java
    ├── data/
    │   └── DataSourceAutoConfiguration.java
    └── ...

Как это работает

// 1. Spring Boot сканирует classpath
// 2. Находит все META-INF/spring.factories или .imports файлы
// 3. Загружает все конфигурационные классы
// 4. Применяет условия (@ConditionalOnClass, @ConditionalOnBean и т.д.)
// 5. Создаёт Bean'ы если условия выполнены

// Пример AutoConfiguration класса
@Configuration
@ConditionalOnClass(DataSource.class) // Условие: DataSource в classpath
@EnableConfigurationProperties(DataSourceProperties.class) // Свойства
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean // Если нет своего Bean'а
    public DataSource dataSource(DataSourceProperties properties) {
        return DataSourceBuilder.create()
            .driverClassName(properties.getDriverClassName())
            .url(properties.getUrl())
            .username(properties.getUsername())
            .password(properties.getPassword())
            .build();
    }
}

Где найти конкретные файлы

# Все AutoConfiguration находятся в spring-boot-autoconfigure.jar

# На диске (для нужного вам Spring Boot):
# ~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/
# или в IDE: External Libraries → spring-boot-autoconfigure-*.jar

# Просмотреть список:
ls ~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/*/

# Распаковать JAR и увидеть все конфигурации:
unzip spring-boot-autoconfigure-3.0.0.jar
cat META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Содержимое файла imports (Spring Boot 3.x)

# Файл: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
org.springframework.boot.autoconfigure.jpa.HibernateJpaAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
... и ещё много других

Как создать свою AutoConfiguration

// 1. Создайте конфигурационный класс
@Configuration
@ConditionalOnClass(MyLibrary.class) // Зависит от наличия класса в classpath
@EnableConfigurationProperties(MyLibraryProperties.class)
public class MyLibraryAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean // Если пользователь не создал свой Bean
    public MyLibraryClient myLibraryClient(MyLibraryProperties props) {
        return new MyLibraryClient(props.getApiKey(), props.getEndpoint());
    }
}

// 2. Свойства конфигурации
@ConfigurationProperties(prefix = "my-library")
public class MyLibraryProperties {
    private String apiKey;
    private String endpoint = "https://api.example.com";
    
    // Getters and setters
}

// 3. Создайте файл resources/META-INF/spring/
// org.springframework.boot.autoconfigure.AutoConfiguration.imports
// С содержимым:
// com.example.MyLibraryAutoConfiguration

// 4. Теперь когда пользователь добавит вашу библиотеку,
// Spring Boot автоматически настроит MyLibraryClient!

// Пользователь просто добавит в application.yml:
// my-library:
//   api-key: abc123
//   endpoint: https://custom.api.com

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

// Spring Boot загружает конфигурации в определённом порядке
// Контролируется через @AutoConfigureAfter и @AutoConfigureBefore

@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class) // После DataSource
@AutoConfigureBefore(JpaRepositoriesAutoConfiguration.class) // Перед JPA
public class MyAutoConfiguration {
    // ...
}

// Это гарантирует, что DataSource создан до моей конфигурации
// И моя конфигурация создана до JPA Repository

Как посмотреть какие AutoConfiguration применены

// Способ 1: Логирование
// В application.properties:
debug=true
// или
logging.level.org.springframework.boot.autoconfigure=DEBUG

// Spring Boot выведет в консоль список всех AutoConfiguration
// которые были применены и какие были пропущены

// Способ 2: Программно
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(MyApplication.class, args);
        
        // Получить все Bean'ы
        String[] beanNames = context.getBeanDefinitionNames();
        for (String name : beanNames) {
            System.out.println(name);
        }
    }
}

// Способ 3: В IDE
// Run → Edit Configurations → VM options:
// -Ddebug=true
// Запустите и посмотрите вывод

Исключение AutoConfiguration

// Если вы не хотите использовать какую-то AutoConfiguration

// Способ 1: Через application.properties
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

// Способ 2: Через аннотацию
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

// Способ 3: Программно
SpringApplication app = new SpringApplication(MyApplication.class);
app.setAdditionalExcludedClasses(
    Collections.singleton(DataSourceAutoConfiguration.class)
);
app.run(args);

Условия для AutoConfiguration

// Spring Boot предоставляет много условных аннотаций

@Configuration
public class ConditionalAutoConfiguration {
    
    // Есть ли класс в classpath
    @ConditionalOnClass(org.springframework.data.redis.core.RedisTemplate.class)
    public RedisTemplate<?> redisTemplate() { return null; }
    
    // Нет ли класса в classpath
    @ConditionalOnMissingClass("org.springframework.data.mongodb.core.MongoTemplate")
    public void mongoNotAvailable() {}
    
    // Есть ли Bean в контексте
    @ConditionalOnBean(DataSource.class)
    public JdbcTemplate jdbcTemplate(DataSource ds) { return new JdbcTemplate(ds); }
    
    // Нет ли Bean'а в контексте
    @ConditionalOnMissingBean
    public MyService myService() { return new MyService(); }
    
    // Проверка свойства
    @ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
    public void featureEnabled() {}
    
    // Проверка версии Java
    @ConditionalOnJava(JavaVersion.ELEVEN_OR_LATER)
    public void javaVersionCheck() {}
    
    // Проверка OS
    @ConditionalOnOsName("Linux")
    public void onLinux() {}
}

Посмотреть содержимое AutoConfiguration JAR

# Найти spring-boot-autoconfigure.jar
find ~/.m2 -name "spring-boot-autoconfigure-*.jar"

# Распаковать и посмотреть
cd /tmp
cp ~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.0.0/spring-boot-autoconfigure-3.0.0.jar .
unzip -q spring-boot-autoconfigure-3.0.0.jar

# Список всех AutoConfiguration
cat META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

# Исходные коды (если есть source jar)
unzip -q spring-boot-autoconfigure-3.0.0-sources.jar
cat org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Структура для собственной библиотеки

my-library/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/
│   │   │       ├── MyLibraryClient.java
│   │   │       ├── MyLibraryAutoConfiguration.java
│   │   │       └── MyLibraryProperties.java
│   │   └── resources/
│   │       └── META-INF/
│   │           └── spring/
│   │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │                   (содержит: com.example.MyLibraryAutoConfiguration)
│   └── test/
│       └── java/
│           └── com/example/
│               └── MyLibraryAutoConfigurationTest.java
└── README.md

# pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <optional>true</optional>
</dependency>

Выводы

  1. AutoConfiguration находятся в META-INF/spring/ файлах внутри spring-boot-autoconfigure.jar
  2. Файл .imports содержит список всех AutoConfiguration классов которые Spring Boot должен загрузить
  3. Условные аннотации контролируют когда применять конфигурацию
  4. Пользователи могут исключать AutoConfiguration если нужна своя
  5. Это делает Spring Boot очень гибким — работает из коробки, но может быть полностью переопределено

Эта механика позволяет Spring Boot предоставлять sensible defaults с нулевой конфигурацией, одновременно сохраняя полный контроль для опытных разработчиков.