← Назад к вопросам
Где хранятся автоматические настройки в 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>
Выводы
- AutoConfiguration находятся в META-INF/spring/ файлах внутри spring-boot-autoconfigure.jar
- Файл .imports содержит список всех AutoConfiguration классов которые Spring Boot должен загрузить
- Условные аннотации контролируют когда применять конфигурацию
- Пользователи могут исключать AutoConfiguration если нужна своя
- Это делает Spring Boot очень гибким — работает из коробки, но может быть полностью переопределено
Эта механика позволяет Spring Boot предоставлять sensible defaults с нулевой конфигурацией, одновременно сохраняя полный контроль для опытных разработчиков.