当前位置: 首页 > article >正文

14、自动配置【源码分析】-初始加载自动配置类

14、自动配置【源码分析】-初始加载自动配置类

Spring Boot的自动配置功能通过智能地加载和配置组件,极大地简化了应用的初始化过程。以下是初始加载自动配置类的详细原理:

### 1. 启动应用

当执行 `SpringApplication.run()` 方法启动Spring Boot应用时,初始化过程开始。

### 2. `@SpringBootApplication` 注解

- **`@SpringBootApplication`** 是一个复合注解,包含了:

  

  - **`@EnableAutoConfiguration`**:启用自动配置功能。

  

  - **`@ComponentScan`**:默认扫描启动类所在包及其子包下的组件。

### 3. `@EnableAutoConfiguration` 注解

- **`@Import(AutoConfigurationImportSelector.class)`**:

  - 通过 `@Import` 注解引入 `AutoConfigurationImportSelector` 类,负责加载自动配置类。

### 4. `AutoConfigurationImportSelector` 类

- **`selectImports()` 方法**:

  1. **加载候选自动配置类**:

  

     - 从 `META-INF/spring.factories` 文件中读取 `org.springframework.boot.autoconfigure.EnableAutoConfiguration` 键对应的所有自动配置类名。

  

     - 该文件位于各个依赖的 `jar` 包中,列出了所有可用的自动配置类。

  2. **条件过滤**:

     - 使用 `@Conditional` 系列注解对候选配置类进行过滤,例如:

     

       - **`@ConditionalOnClass`**:当类路径中存在指定类时,配置类生效。

       

       - **`@ConditionalOnMissingBean`**:当容器中不存在指定类型的 Bean 时,配置类生效。

       

       - **`@ConditionalOnProperty`**:根据配置文件中的属性值决定是否生效。

     

     - 只有满足条件的自动配置类才会被保留。

### 5. 加载并注册自动配置类

- 将符合条件的自动配置类注册到 Spring 容器中。

- 这些自动配置类通常使用 `@Bean` 注解定义需要自动配置的组件,例如数据源、Web MVC 等。

### 6. 示例:`DataSourceAutoConfiguration`

- **自动配置数据源**:

  - 当引入数据库相关依赖(如 `spring-boot-starter-jdbc`)且配置文件中提供了数据库连接信息时,`DataSourceAutoConfiguration` 会被加载。

  - 它根据条件注解判断是否需要自动配置数据源,并在满足条件时创建数据源 Bean。

### 总结

- **初始加载自动配置类的流程**:

  1. 通过 `@EnableAutoConfiguration` 引入 `AutoConfigurationImportSelector`。

  2. 从 `META-INF/spring.factories` 加载候选自动配置类。

  3. 使用 `@Conditional` 注解进行条件过滤,仅保留符合条件的配置类。

  4. 将符合条件的自动配置类注册到 Spring 容器,完成自动配置。

通过这一机制,Spring Boot 实现了智能化的组件自动配置,减少了开发人员的手动配置工作,提高了开发效率。

http://www.lryc.cn/news/2384664.html

相关文章:

  • word为章节标题添加自动编号
  • 无人机飞行间隔安全智能评估、安全风险评估
  • C++成员对象和封闭类
  • 【VLNs篇】03:VLMnav-端到端导航与视觉语言模型:将空间推理转化为问答
  • PCB设计实践(二十五)贴片电阻与插件电阻的全面解析:差异、演进与应用场景
  • 知道不知道
  • 文章记单词 | 第106篇(六级)
  • SpringBoot项目中Redis的使用
  • Canvas设计图片编辑器全讲解(一)Canvas基础(万字图文讲解)
  • 利用Qt绘图随机生成带多种干扰信息的数字图片
  • STM32——从点灯到传感器控制
  • java day14
  • Tailwind css实战,基于Kooboo构建AI对话框页面(一)
  • 重塑数学边界:人工智能如何引领数学研究的新纪元
  • docker部署并测试翻译模型-CSANMT连续语义增强机器翻译
  • 蓝桥杯2025.5.23每日一题-儿童数
  • Spring Boot项目配置核心 - pom.xml的依赖管理与构建优化
  • 告别手抖困扰:全方位健康护理指南
  • 图解深度学习 - 特征工程(DL和ML的核心差异)
  • 《短线操盘跟庄关键技术》速读笔记
  • Datacom-hcia~Datacom-hcie学习笔记索引
  • Oracle 中 SHRINK 与 MOVE 操作的比较
  • 受不了github的网络限制了,我开源了一个图床工具 gitee-spring-boot-starter
  • 【Python 基础与实战】从基础语法到项目应用的全流程解析
  • 2025年医美行业报告60+份汇总解读 | 附 PDF 下载
  • API自动化与持续集成核心实战知识点!
  • 基于SpringBoot+Vue的社区医院信息平台设计与实现
  • C++ 中的暴力破解算法
  • 前端[插件化]设计思想_Vue、React、Webpack、Vite、Element Plus、Ant Design
  • 率先实现混合搜索:使用 Elasticsearch 和 Semantic Kernel