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 dependencies
META-INF/
File, getA list of configuration classes corresponding to key values.
-
Filtering and sorting:
- exclude
exclude
The specified class (through@SpringBootApplication(exclude={})
)。 - according to
@AutoConfigureOrder
、@AutoConfigureBefore
、@AutoConfigureAfter
Adjust the loading order.
- exclude
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 interface:
Condition
Interface, throughmatches()
Method returns whether the condition is satisfied. -
Processing process:
ConfigurationClassParser
When parsing the configuration class,ConditionEvaluator
Evaluate 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
@Bean
Register 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:pass
ConfigurationPropertiesBindingPostProcessor
Postprocessor 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:exist
Added 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:accomplish
Condition
Interface, combined with@Conditional
use.
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 |
@EnableAutoConfiguration ImportAutoConfigurationImportSelector
|
Configuration class discovery | Scan allMETA-INF/ Automatic configuration class registered in |
Conditional loading | pass@ConditionalOnClass 、@ConditionalOnMissingBean Dynamic judgment of such annotations |
Attribute binding |
@ConfigurationProperties CombinedEnvironment Attribute 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!