02.6、Spring Boot 3自动配置原理
Spring Boot 3 自动配置原理
Spring Boot 的自动配置是其核心特性之一,它能够根据类路径中的依赖自动配置 Spring 应用。理解自动配置原理,有助于我们更好地使用和自定义 Spring Boot。
本章节内容参考官方文档顺序: 根据 Spring Boot 官方文档 - Auto-configuration,官方文档按照以下顺序讲解:
- Auto-configuration Overview(自动配置概览)
- @EnableAutoConfiguration(启用自动配置)
- Condition Evaluation(条件评估)
- Auto-configuration Classes(自动配置类)
- Custom Auto-configuration(自定义自动配置)
本节将学习:自动配置机制、@ConditionalOnXxx 注解、自定义自动配置,以及配置优先级。
自动配置机制
官方定义
根据 Spring Boot 官方文档 - Auto-configuration,自动配置的定义是:
自动配置 是 Spring Boot 根据类路径中的依赖、已定义的 Bean 以及各种属性设置,自动配置 Spring 应用的能力。自动配置会尝试根据添加的 jar 依赖自动配置 Spring 应用。
工作原理
根据官方文档,自动配置的工作流程如下:
自动配置流程:
- 启动时扫描:Spring Boot 启动时扫描
META-INF/spring.factories文件 - 发现配置类:找到所有
@EnableAutoConfiguration对应的自动配置类 - 条件评估:使用
@ConditionalOnXxx注解评估条件是否满足 - 创建 Bean:满足条件时,自动配置类创建相应的 Bean
- 注册 Bean:将创建的 Bean 注册到 Spring 容器中
spring.factories
自动配置类定义在 META-INF/spring.factories 中:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
@ConditionalOnXxx 注解
常用条件注解
@ConditionalOnClass
当类存在时生效:
@Configuration @ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration { @Bean public DataSource dataSource() { // 配置数据源 } }
@ConditionalOnMissingBean
当 Bean 不存在时生效:
@Configuration public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public RestTemplate restTemplate() { return new RestTemplate(); } }
@ConditionalOnProperty
当属性存在时生效:
@Configuration @ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true") public class FeatureAutoConfiguration { // 配置 }
自定义自动配置
创建自动配置类
@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(MyProperties properties) { return new MyService(properties); } }
注册自动配置类
在 META-INF/spring.factories 中注册:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfiguration
配置属性类
@ConfigurationProperties(prefix = "my") public class MyProperties { private String name; private int port; // getters and setters }
配置优先级
优先级顺序
优先级从高到低:
- 命令行参数
- 系统属性
- 环境变量
- application.yml
- application.properties
- 默认值
示例
# 命令行参数(最高优先级) java -jar app.jar --server.port=9090 # 环境变量 export SERVER_PORT=9090 # application.yml server: port: 8080
官方资源
根据 Spring Boot 官方文档 - Auto-configuration:
-
自动配置机制:官方文档详细说明了 Spring Boot 的自动配置机制,包括如何扫描自动配置类、如何评估条件、如何创建 Bean 等。文档强调,自动配置是 Spring Boot 的核心特性之一,能够大大简化 Spring 应用的配置。
-
@EnableAutoConfiguration:官方文档详细说明了
@EnableAutoConfiguration注解的作用和使用方式,包括如何启用自动配置、如何排除特定的自动配置类等。文档提供了详细的配置示例。 -
条件评估:官方文档详细说明了条件评估机制,包括
@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等条件注解的使用方式。文档说明了条件评估的优先级和组合方式。 -
自动配置类:官方文档详细说明了自动配置类的结构和使用方式,包括如何定义自动配置类、如何注册到
spring.factories文件中等。文档提供了完整的自动配置类示例。 -
自定义自动配置:官方文档详细说明了如何创建自定义的自动配置类,包括如何定义条件、如何创建 Bean、如何配置属性等。文档提供了完整的自定义自动配置示例。
参考资源:
- Spring Boot 自动配置:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.auto-configuration
- 条件注解文档:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration.condition-annotations
- 自定义自动配置:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration
本节小结
在本节中,我们学习了:
第一个是自动配置机制。 Spring Boot 通过扫描类路径和条件检查自动配置应用。
第二个是 @ConditionalOnXxx 注解。 用于条件化配置,控制 Bean 的创建。
第三个是自定义自动配置。 可以创建自己的自动配置类。
第四个是配置优先级。 了解配置的优先级顺序,有助于正确配置应用。
这就是 Spring Boot 3 自动配置原理。理解这些原理,有助于更好地使用和自定义 Spring Boot。
在下一节,我们将学习 Spring Boot 3 的配置文件管理,了解如何管理不同环境的配置。