02.6Spring Boot 3自动配置原理

分类: Spring 6和Spring Boot 3基础

Spring Boot 3 自动配置原理

Spring Boot 的自动配置是其核心特性之一,它能够根据类路径中的依赖自动配置 Spring 应用。理解自动配置原理,有助于我们更好地使用和自定义 Spring Boot。

本章节内容参考官方文档顺序: 根据 Spring Boot 官方文档 - Auto-configuration,官方文档按照以下顺序讲解:

  1. Auto-configuration Overview(自动配置概览)
  2. @EnableAutoConfiguration(启用自动配置)
  3. Condition Evaluation(条件评估)
  4. Auto-configuration Classes(自动配置类)
  5. Custom Auto-configuration(自定义自动配置)

本节将学习:自动配置机制、@ConditionalOnXxx 注解、自定义自动配置,以及配置优先级。

自动配置机制

官方定义

根据 Spring Boot 官方文档 - Auto-configuration,自动配置的定义是:

自动配置 是 Spring Boot 根据类路径中的依赖、已定义的 Bean 以及各种属性设置,自动配置 Spring 应用的能力。自动配置会尝试根据添加的 jar 依赖自动配置 Spring 应用。

工作原理

根据官方文档,自动配置的工作流程如下:

自动配置流程:

  1. 启动时扫描:Spring Boot 启动时扫描 META-INF/spring.factories 文件
  2. 发现配置类:找到所有 @EnableAutoConfiguration 对应的自动配置类
  3. 条件评估:使用 @ConditionalOnXxx 注解评估条件是否满足
  4. 创建 Bean:满足条件时,自动配置类创建相应的 Bean
  5. 注册 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 }

配置优先级

优先级顺序

优先级从高到低:

  1. 命令行参数
  2. 系统属性
  3. 环境变量
  4. application.yml
  5. application.properties
  6. 默认值

示例

# 命令行参数(最高优先级) java -jar app.jar --server.port=9090 # 环境变量 export SERVER_PORT=9090 # application.yml server: port: 8080

官方资源

根据 Spring Boot 官方文档 - Auto-configuration

  1. 自动配置机制:官方文档详细说明了 Spring Boot 的自动配置机制,包括如何扫描自动配置类、如何评估条件、如何创建 Bean 等。文档强调,自动配置是 Spring Boot 的核心特性之一,能够大大简化 Spring 应用的配置。

  2. @EnableAutoConfiguration:官方文档详细说明了 @EnableAutoConfiguration 注解的作用和使用方式,包括如何启用自动配置、如何排除特定的自动配置类等。文档提供了详细的配置示例。

  3. 条件评估:官方文档详细说明了条件评估机制,包括 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty 等条件注解的使用方式。文档说明了条件评估的优先级和组合方式。

  4. 自动配置类:官方文档详细说明了自动配置类的结构和使用方式,包括如何定义自动配置类、如何注册到 spring.factories 文件中等。文档提供了完整的自动配置类示例。

  5. 自定义自动配置:官方文档详细说明了如何创建自定义的自动配置类,包括如何定义条件、如何创建 Bean、如何配置属性等。文档提供了完整的自定义自动配置示例。

参考资源

本节小结

在本节中,我们学习了:

第一个是自动配置机制。 Spring Boot 通过扫描类路径和条件检查自动配置应用。

第二个是 @ConditionalOnXxx 注解。 用于条件化配置,控制 Bean 的创建。

第三个是自定义自动配置。 可以创建自己的自动配置类。

第四个是配置优先级。 了解配置的优先级顺序,有助于正确配置应用。

这就是 Spring Boot 3 自动配置原理。理解这些原理,有助于更好地使用和自定义 Spring Boot。

在下一节,我们将学习 Spring Boot 3 的配置文件管理,了解如何管理不同环境的配置。