DeepReach
Spring18 interview questions

Spring Boot Internals: How Auto-Configuration Really Works

Deep dive into @SpringBootApplication, @Conditional annotations, and the spring.factories mechanism. Understand what happens before your main() even runs.

Spring BootAuto-ConfigConditionsBeans

Spring Boot Internals: How Auto-Configuration Really Works

Overview

Spring Boot's auto-configuration is one of its most powerful features. Understanding how it works under the hood is critical for senior developers who need to debug startup issues, write custom starters, or optimize boot time.

The @SpringBootApplication Annotation

@SpringBootApplication is a meta-annotation that combines three annotations:

java
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication { ... }
  • @SpringBootConfiguration: Marks the class as a configuration class (extends @Configuration)
  • @EnableAutoConfiguration: Triggers the auto-configuration mechanism
  • @ComponentScan: Scans the package and sub-packages for components

How EnableAutoConfiguration Works

The @EnableAutoConfiguration annotation imports AutoConfigurationImportSelector, which reads META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (Spring Boot 3.x) or META-INF/spring.factories (Spring Boot 2.x).

java
// AutoConfigurationImportSelector.java (simplified)
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
        .getCandidates();
    return configurations;
}

@Conditional Annotations

Auto-configuration classes use @Conditional variants to conditionally apply configuration:

AnnotationCondition
@ConditionalOnClassClass is on the classpath
@ConditionalOnMissingBeanNo bean of that type exists
@ConditionalOnPropertyA property is set
@ConditionalOnWebApplicationRunning in a web context
java
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
    @Bean
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().build();
    }
}

Interview Questions

  1. 1.What is the difference between @Configuration and @SpringBootConfiguration?
  2. 2.How would you exclude a specific auto-configuration class?
  3. 3.What happens when two auto-configurations define a bean of the same type?
  4. 4.How do you write a custom Spring Boot starter?
  5. 5.What is the order of bean initialization in Spring Boot?

Common Pitfalls

  • Circular dependencies: Auto-configured beans can create circular dependency issues. Use @Lazy or restructure.
  • Ordering issues: Use @AutoConfigureBefore / @AutoConfigureAfter to control ordering.
  • Classpath pollution: Adding a dependency can trigger unexpected auto-configurations.