On this page
Auto-Configuration
Auto-configuration is Spring Boot’s mechanism for automatically configuring beans based on classpath dependencies, properties, and conditions — minimizing boilerplate configuration.
How It Works
Spring Boot scans META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (or spring.factories in older versions) and conditionally applies configurations.
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnProperty(name = "spring.datasource.url")
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
Key Conditional Annotations
| Annotation | Condition |
|---|---|
@ConditionalOnClass |
Class present on classpath |
@ConditionalOnMissingBean |
No bean of type exists |
@ConditionalOnProperty |
Property matches value |
@ConditionalOnWebApplication |
Running as web app |
@ConditionalOnExpression |
SpEL expression is true |
Disabling Auto-Configuration
# application.yml
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Or via annotation:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class Application { }
Inspecting Auto-Configuration
# List positive and negative matches
java -jar myapp.jar --debug
# Or add to application.properties
debug=true
Actuator endpoint:
management:
endpoints:
web:
exposure:
include: conditions
Visit /actuator/conditions to see which auto-configurations applied.
Custom Auto-Configuration
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
return new MyService(properties.getEndpoint());
}
}
@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {
private String endpoint = "http://localhost:8080";
// getters/setters
}
Register in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:
com.example.MyServiceAutoConfiguration
@SpringBootApplication
Combines three annotations:
@SpringBootConfiguration // @Configuration
@EnableAutoConfiguration // triggers auto-config
@ComponentScan // scans current package
public class Application { }
Best Practices
- Use
application.ymlproperties instead of custom config when possible - Exclude unused auto-configurations to speed startup
- Use
@ConditionalOnMissingBeanin custom starters to allow overrides - Run with
--debugwhen troubleshooting unexpected bean creation