Spring Boot Auto-Configuration Principle Explained
Core Concept
Spring Boot's auto-configuration is one of its most powerful features. It follows the convention over configuration principle, significantly simplifying Spring application development.
How Auto-Configuration Works
1. @SpringBootApplication Annotation
This is the entry point for auto-configuration, combining three key annotations:
java@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication { }
@EnableAutoConfiguration is the key to enabling auto-configuration.
2. @EnableAutoConfiguration Mechanism
java@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
AutoConfigurationImportSelector is the core class implementing auto-configuration.
3. Core Auto-Configuration Process
Step 1: Read META-INF/spring.factories
Spring Boot scans all JARs for META-INF/spring.factories files during startup:
propertiesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
Step 2: Conditional Filtering
Spring Boot uses conditional annotations to decide whether to load configurations:
| Annotation | Purpose |
|---|---|
@ConditionalOnClass | Active when specified class exists |
@ConditionalOnMissingClass | Active when specified class doesn't exist |
@ConditionalOnBean | Active when specified bean exists |
@ConditionalOnMissingBean | Active when specified bean doesn't exist |
@ConditionalOnProperty | Active when property condition is met |
Step 3: Property Binding
java@Configuration @ConditionalOnClass(DataSource.class) @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean public DataSource dataSource(DataSourceProperties properties) { return DataSourceBuilder.create() .url(properties.getUrl()) .build(); } }
Customizing Auto-Configuration
Exclude Specific Configurations
java@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class Application { }
Or in application.yml:
yamlspring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
Summary
Spring Boot auto-configuration core mechanisms:
- SPI Pattern: Discovers configurations via
spring.factories - Conditional Assembly: Uses
@Conditionalannotations for smart loading - Property Binding: Externalized configuration via
@ConfigurationProperties - Convention over Configuration: Sensible defaults reduce explicit configuration