Auto-Configuration Mechanism
Introduction
Spring Boot's auto-configuration inspects your classpath and config, then registers beans you would otherwise wire manually—DataSource, Jackson, Tomcat, JPA, and more. Understanding how it works helps you fix "bean not created" issues, exclude unwanted config, and build custom starters. This chapter traces @SpringBootApplication, condition annotations, and the AutoConfiguration.imports file in Boot 3.
Prerequisites
What Auto-Configuration Does
Without Boot you might write:
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("...");
return ds;
}With Boot + spring-boot-starter-jdbc + spring.datasource.* properties, DataSourceAutoConfiguration creates HikariDataSource when conditions match.
Flow:
Classpath has Hikari + JDBC driver
↓
DataSourceAutoConfiguration matches
↓
Reads spring.datasource.* properties
↓
Registers DataSource bean@SpringBootApplication Breakdown
@SpringBootApplication
public class DemoApplication { }Combines:
| Annotation | Role |
|---|---|
@Configuration | Java config class |
@EnableAutoConfiguration | Import auto-config |
@ComponentScan | Scan current package + subpackages |
Exclude specific auto-config:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})Or in YAML:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationBoot 3 Registration: AutoConfiguration.imports
Spring Boot 2 used META-INF/spring.factories. Boot 3 uses:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsEach line is fully qualified auto-config class name, e.g.:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationSpring Boot loads listed classes and evaluates their @Conditional* annotations.
Conditional Annotations
| Annotation | Matches when |
|---|---|
@ConditionalOnClass | Class on classpath |
@ConditionalOnMissingBean | Bean not already defined |
@ConditionalOnProperty | Property set/true |
@ConditionalOnWebApplication | Servlet or reactive web app |
Excerpt pattern from DataSourceAutoConfiguration concept:
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// ...
}Your custom @Bean DataSource replaces auto-configured one (@ConditionalOnMissingBean).
View Auto-Configuration Report
Startup with debug:
java -jar app.jar --debugOr:
logging:
level:
org.springframework.boot.autoconfigure: DEBUGLook for Positive matches / Negative matches sections—shows why config applied or skipped.
Example negative match reason:
Did not match:
- @ConditionalOnClass did not find required class 'org.h2.Driver'Starter = Dependencies + Auto-Config
spring-boot-starter-web pulls:
- Tomcat (embedded)
- Spring MVC
- Jackson JSON
- Related auto-config classes
You add one dependency; Boot assembles the stack.
See Maven for dependency management basics.
Override Auto-Configuration Safely
Preferred order:
- Properties —
application.ymltune behavior - Custom
@Bean— replace specific component - Exclude auto-config — last resort when feature unused
Tip
Do Not Copy Entire Auto-Config Into Your Code
Replace only the bean you need; keep Boot defaults for the rest.
FAQ
Bean defined twice?
Your @Bean plus auto-config—use @ConditionalOnMissingBean on custom or exclude auto-config.
Auto-config not running?
Class not in AutoConfiguration.imports, condition failed, or excluded.
Spring Boot 2 vs 3 imports file?
Upgrade uses new AutoConfiguration.imports path—check third-party starters support Boot 3.
How many auto-config classes?
100+—you rarely read all; use debug report for one feature.
Test slice without full context?
@WebMvcTest, @DataJpaTest import subset—faster tests.
Custom starter next?
Custom Starter Extension packages your auto-config.