SoFunction
Updated on 2025-04-14

Detailed explanation of the way SpringBoot implements automatic configuration

The automatic configuration of Spring Boot is the core implementation of its "convention over configuration" concept. Through intelligent inference and conditional loading mechanism, the configuration process of Spring applications is greatly simplified. The following is a detailed analysis of its implementation principle:

1. Automatically configure the trigger mechanism

1.1 Core annotation @EnableAutoConfiguration

  • effect: Enable the automatic configuration process to trigger the loading of the automatic configuration class.
  • Implementation principle
    pass@Import()Import the selector class, which is responsible for scanning and loading all automatic configuration classes that meet the criteria.
@Target()
@Retention()
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { /* ... */ })
public @interface SpringBootApplication {
    // Combined @Configuration, @EnableAutoConfiguration, @ComponentScan}

1.2 Automatically configure class loading process

  • Startup phase()When initialized, automatic configuration is triggered.
  • load: Scan all dependenciesMETA-INF/File, getA list of configuration classes corresponding to key values.
  • Filtering and sorting
    • excludeexcludeThe specified class (through@SpringBootApplication(exclude={}))。
    • according to@AutoConfigureOrder@AutoConfigureBefore@AutoConfigureAfterAdjust the loading order.

2. Conditional configuration mechanism

Spring Boot ByConditional annotationTo realize intelligent configuration, the core annotations include:

Conditional annotation effect Typical application scenarios
@ConditionalOnClass Effective when the classpath has a specified class Automatically configure Tomcat/Jetty embedded containers
@ConditionalOnMissingBean Effective if no specified bean exists in the container Avoid overwriting user-defined beans
@ConditionalOnProperty Effective when a specified attribute exists in the configuration file and matches the value Multi-environment configuration switching
@ConditionalOnWebApplication The current application takes effect when it is a web application Enable MVC configuration in a web environment only

2.1 The implementation principle of conditional annotation

  • Underlying interfaceConditionInterface, throughmatches()Method returns whether the condition is satisfied.
  • Processing process
    ConfigurationClassParserWhen parsing the configuration class,ConditionEvaluatorEvaluate all conditional annotations.

Example:DataSourceAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ ,  })
@ConditionalOnMissingBean(type = "io.")
@EnableConfigurationProperties()
@Import({ ,  })
public class DataSourceAutoConfiguration {
    // Take effect when the classpath has DataSource and R2DBC is not configured}

3. Automatically configure the class structure

3.1 Typical automatic configuration class composition

  • @Configuration: declared as a configuration class.
  • Conditional annotation: Control the effective conditions of the configuration class.
  • @EnableConfigurationProperties: Bind external configuration (such as)。
  • Bean definition method:use@BeanRegister components, usually combined with conditional annotations.

Example:HttpEncodingAutoConfiguration

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties()
@ConditionalOnWebApplication(type = )
@ConditionalOnClass()
@ConditionalOnProperty(prefix = "", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final Encoding properties;

    public HttpEncodingAutoConfiguration(ServerProperties properties) {
         = ().getEncoding();
    }

    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        // Create filters based on configuration        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        (().name());
        (());
        (());
        return filter;
    }
}

4. External configuration and attribute binding

4.1 @EnableConfigurationProperties

  • effect:Will/The properties in the java object are bound to the Java object.
  • accomplish:passConfigurationPropertiesBindingPostProcessorPostprocessor handles property binding.

Example:ServerProperties

server:
  port: 8080
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
    private Integer port;
    private Servlet servlet;
    
    public static class Servlet {
        private final Encoding encoding = new Encoding();
        // getters/setters
    }
}

4.2 Attribute override rules

  • Priority order
    Command Line Parameters > Java System Properties > OS Environment Variables > Application Configuration Files (application-{profile}.yml)> Default configuration.

5. Debugging and Optimizing Automatic Configuration

5.1 Automatic debugging configuration

  • Enable debug logging:existAdded in:

debug=true
  • Will print on startupConditional Assessment Report, displays which autoconfiguration classes are enabled/excluded.

  • View report content

============================
CONDITION EVALUATION REPORT
============================
Positive matches:
-----------------
   DataSourceAutoConfiguration matched:
      - @ConditionalOnClass found required classes '', '' (OnClassCondition)

Negative matches:
-----------------
   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class '' (OnClassCondition)

5.2 Exclude unnecessary automatic configuration

  • Method 1: Annotation exclusion
@SpringBootApplication(exclude = {})
  • Method 2: Configuration file exclusion
=

6. Customize automatic configuration

6.1 Create a custom Starter

  • Define automatic configuration classes
@Configuration
@ConditionalOnClass()
@EnableConfigurationProperties()
public class MyServiceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyServiceProperties properties) {
        return new MyService(());
    }
}
  • Declare configuration class
    existsrc/main/resources/META-INF/Added in:
=
  • Package and release
    Package the project as a Starter (usually namedxxx-spring-boot-starter), for other projects to rely on.

6.2 Extension of conditional annotations

  • Custom conditions:accomplishConditionInterface, combined with@Conditionaluse.
public class OnProductionEnvironmentCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "prod".equals(().getProperty(""));
    }
}

@Configuration
@Conditional()
public class ProductionConfig {
    //Special configuration for production environment}

Summary: The core mechanism of Spring Boot automatic configuration

mechanism Implementation method
Trigger the entrance @EnableAutoConfigurationImportAutoConfigurationImportSelector
Configuration class discovery Scan allMETA-INF/Automatic configuration class registered in
Conditional loading pass@ConditionalOnClass@ConditionalOnMissingBeanDynamic judgment of such annotations
Attribute binding @ConfigurationPropertiesCombinedEnvironmentAttribute source
Custom extensions Create Starter and register automatic configuration classes, and control effective scenarios with conditional annotations

The above is a detailed explanation of the method of SpringBoot to implement automatic configuration. For more information about SpringBoot automatic configuration, please follow my other related articles!