Skip to content

Spring Boot Auto Configuration, Startup Lifecycle, and Core Internals

@SpringBootApplication includes @EnableAutoConfiguration, which imports AutoConfigurationImportSelector.

flowchart TD
A["@SpringBootApplication"] --> B["@EnableAutoConfiguration"]
B --> C["AutoConfigurationImportSelector"]
C --> D["META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports"]
D --> E["Evaluate @Conditional... annotations"]
E --> F["Load matching AutoConfiguration classes"]
  1. @SpringBootApplication
  2. Contains @EnableAutoConfiguration
  3. Imports AutoConfigurationImportSelector
  4. Reads:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

(Older Spring Boot versions used spring.factories.)

Example entries:

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Auto-configuration classes are loaded only when their conditions match.

Example:

If HikariCP and a JDBC driver are on the classpath, DataSourceAutoConfiguration is applied automatically.

  • Classpath
  • Existing beans
  • Configuration properties
  • Environment

The Condition Evaluation Report shows which auto-configurations were applied or skipped and why.

Enable it with:

debug=true

or

Terminal window
--debug

Example output:

Positive matches:
-----------------
DataSourceAutoConfiguration matched
Negative matches:
-----------------
MongoAutoConfiguration did not match (MongoDB classes not found)
  • Diagnose missing auto-configuration
  • Identify missing dependencies
  • Verify property-based configuration

Loads configuration only when a class exists on the classpath.

@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
}

Creates a bean only if the application has not already defined one.

@Bean
@ConditionalOnMissingBean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}

This enables user-defined beans to override Boot defaults.

Loads configuration based on a property value.

@ConditionalOnProperty(
name = "feature.cache.enabled",
havingValue = "true"
)
feature.cache.enabled=true
Annotation Usage
@ConditionalOnProperty Enable beans using configuration values
@ConditionalOnClass Enable beans only when classes exist on the classpath

Calling:

SpringApplication.run(Application.class, args);

triggers the following sequence.

flowchart TD
A["SpringApplication.run()"] --> B["Create SpringApplication"]
B --> C["Prepare Environment"]
C --> D["Print Banner"]
D --> E["Create ApplicationContext"]
E --> F["Run ApplicationContextInitializers"]
F --> G["Component Scan & Bean Registration"]
G --> H["Auto Configuration"]
H --> I["Start Embedded Server"]
I --> J["Publish Lifecycle Events"]

This expands on the shorter Application Startup overview with the full 9-step sequence.

  1. Create SpringApplication

    • Determine application type (MVC, Reactive, Non-Web)
    • Identify the main class
  2. Prepare the Environment

    • Load application.properties
    • Load application.yml
    • Read environment variables
    • Read JVM system properties
    • Create ConfigurableEnvironment
  3. Print the Spring Boot banner.

  4. Create the appropriate ApplicationContext.

Application Type Context
Spring MVC AnnotationConfigServletWebServerApplicationContext
Reactive AnnotationConfigReactiveWebServerApplicationContext
Non-Web AnnotationConfigApplicationContext
  1. Execute ApplicationContextInitializer.

  2. Perform component scanning and bean registration.

  3. Apply auto-configuration through AutoConfigurationImportSelector.

  4. Start the embedded server (Tomcat by default; Jetty and Undertow are supported alternatives).

  5. Publish lifecycle events, then execute any CommandLineRunner and ApplicationRunner beans.


Responsibilities:

  • Create SpringApplication
  • Prepare the Environment
  • Create the ApplicationContext
  • Load beans
  • Apply auto-configuration
  • Start the embedded server
  • Publish application events

Returns:

ConfigurableApplicationContext

Allows customization of the ApplicationContext before it is refreshed.

public class MyInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext context) {
System.out.println("Context initializing");
}
}

Register using:

  • SpringApplication.addInitializers()
  • spring.factories (legacy registration approach)
  • Add property sources
  • Modify the environment
  • Programmatically register beans

Spring Boot exposes configuration through the Environment abstraction.

Interfaces:

Environment
ConfigurableEnvironment
  1. Command-line arguments
  2. Environment variables
  3. application.properties
  4. application.yml
  5. Default properties

Example:

server.port=8081

Access values:

@Value("${server.port}")

or

environment.getProperty("server.port");

Event Description
ApplicationStartingEvent Application startup begins
ApplicationEnvironmentPreparedEvent Environment prepared
ApplicationContextInitializedEvent Context initialized
ApplicationPreparedEvent Context prepared but not refreshed
ApplicationStartedEvent Context refreshed
ApplicationReadyEvent Ready to serve requests
ApplicationFailedEvent Startup failed

Example listener:

@Component
public class MyListener {
@EventListener
public void onReady(ApplicationReadyEvent event) {
System.out.println("Application is ready");
}
}

Spring Boot CLI is a command-line tool for rapidly developing Spring applications using Groovy.

Run:

Terminal window
spring run app.groovy

Example:

@RestController
class HelloController {
@RequestMapping("/")
String home() {
"Hello Spring Boot"
}
}

Execute:

Terminal window
spring run app.groovy
  • Rapid prototyping
  • Learning
  • Small APIs
  • Quick experiments

It is rarely used in production systems.


A starter bundles dependencies and auto-configuration.

Examples:

spring-boot-starter-web
spring-boot-starter-data-jpa

Step 1: Create an Auto-Configuration Module

Section titled “Step 1: Create an Auto-Configuration Module”
@Configuration
@ConditionalOnClass(Logger.class)
public class LoggingAutoConfiguration {
@Bean
public Logger logger() {
return new Logger();
}
}

File:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Contents:

com.example.LoggingAutoConfiguration

Dependencies:

logging-autoconfigure
logging-library
logging-spring-boot-starter

The auto-configuration is applied automatically.

  • Auto-configuration is driven by AutoConfigurationImportSelector, conditional annotations, and metadata in AutoConfiguration.imports.
  • Conditional annotations activate configuration based on the classpath, existing beans, or properties.
  • SpringApplication.run() orchestrates the complete application bootstrap process.
  • The Environment abstraction unifies configuration from multiple property sources with well-defined precedence.
  • Lifecycle events and ApplicationContextInitializer provide extension points during application startup.
  • Custom starters package reusable dependencies and auto-configuration for simplified application setup.