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.yml properties instead of custom config when possible
  • Exclude unused auto-configurations to speed startup
  • Use @ConditionalOnMissingBean in custom starters to allow overrides
  • Run with --debug when troubleshooting unexpected bean creation