Spring Boot 的自动装配

embedded/2025/3/18 11:59:01/

Spring Boot 的自动装配(Auto Configuration)是其核心特性之一,通过智能化的条件判断和配置加载机制,极大简化了传统 Spring 应用的配置复杂度。其原理和实现过程可概括为以下几个关键点:


一、核心触发机制:@EnableAutoConfiguration 注解

自动装配的入口是 @SpringBootApplication 组合注解,其中包含 @EnableAutoConfiguration。该注解通过 @Import(AutoConfigurationImportSelector.class) 导入 AutoConfigurationImportSelector 类,触发自动配置流程。

  • 作用AutoConfigurationImportSelector 会扫描所有依赖中的 META-INF/spring.factories 文件,加载其中声明的自动配置类(如 DataSourceAutoConfigurationWebMvcAutoConfiguration 等)。
  • 延迟处理:由于 AutoConfigurationImportSelector 实现了 DeferredImportSelector 接口,其配置类的加载会延迟到其他普通配置类解析完成后执行,确保依赖顺序正确。

二、配置类加载:SPI 机制与 spring.factories 文件

Spring Boot 利用 SPI(Service Provider Interface)机制,通过 SpringFactoriesLoader 加载所有依赖包中的 spring.factories 文件。例如,在 spring-boot-autoconfigure 模块中,该文件定义了 EnableAutoConfiguration 键对应的自动配置类列表。

 
# META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 

三、条件装配:按需加载配置类

自动配置类通过 条件注解 动态判断是否生效,避免加载不必要的组件。常用注解包括:

  1. @ConditionalOnClass:类路径存在指定类时生效(如 DataSource 存在时加载数据库配置)。
  2. @ConditionalOnMissingBean:容器中不存在指定 Bean 时生效(如未手动定义 DataSource 则自动配置默认数据源)。
  3. @ConditionalOnProperty:根据配置文件属性值决定是否加载(如 myapp.feature.enabled=true)。

四、配置类解析与 Bean 注册

  1. 过滤与排序:通过条件注解筛选出有效的配置类,并按 @AutoConfigureOrder@AutoConfigureAfter 调整加载顺序。
  2. Bean 定义注册:配置类中的 @Bean 方法生成的 Bean 定义会被注册到 Spring 容器,最终由 BeanFactoryPostProcessor 处理并实例化。

五、Starter 模块的设计

Starter 是自动装配的载体,每个 Starter 包含:

  1. 自动配置模块:通过 @Configuration 类定义 Bean,并配合条件注解实现按需加载。
  2. 依赖管理:通过 Maven 的依赖传递,简化用户对第三方库的版本管理(如 spring-boot-starter-web 内嵌 Tomcat 和 Spring MVC 依赖)。

六、启动流程中的自动装配阶段

在 Spring Boot 启动时,自动装配发生在 prepareContext() 方法中,具体步骤包括:

  1. 加载 spring.factories 中的配置类。
  2. 执行条件过滤,排除不满足条件的配置。
  3. 将筛选后的配置类解析为 BeanDefinition,注册到容器。

总结

Spring Boot 的自动装配本质是 约定优于配置 思想的体现,通过 SPI 机制加载配置类、条件注解动态过滤、Starter 模块化依赖管理,实现了零配置或低配置的开发体验。其底层依赖 Spring 框架的 BeanFactoryPostProcessor@Import 机制,确保扩展性而不侵入框架源码。


http://www.ppmy.cn/embedded/173586.html

相关文章

HarmonyOS第26天:应用发布与推广全攻略:从0到1走向市场

一、引言:开启 HarmonyOS 应用之旅 在数字化时代的浪潮中,HarmonyOS 以其独特的分布式理念和强大的跨设备协同能力,为应用开发领域开辟了一片崭新的天地。随着 HarmonyOS 市场份额的稳步增长,其生态设备数量已突破 9 亿大关,吸引了超过 254 万开发者投身其中 ,成为了开发…

【操作系统安全】任务6:Linux 系统文件与文件系统安全 学习指南

目录 一、文件系统基础概念 二、查看文件系统信息 2.1 磁盘空间查看 2.2 分区与挂载管理 2.3 文件系统类型操作 三、文件系统权限配置 3.1 基础权限管理 3.2 所有权管理 3.3 特殊权限设置 四、文件操作基础 4.1 文件创建 4.2 文件删除 4.3 文件复制与移动 4.4 文件…

Python游戏开发自学指南:从入门到实践(第四天)

Python不仅适用于数据分析、Web开发和自动化脚本,还可以用于游戏开发!虽然Python不是传统意义上的游戏开发语言,但其简洁的语法和丰富的库使其成为初学者学习游戏开发的绝佳选择。本文将为你提供一份全面的Python游戏开发自学指南&#xff0c…

dify数据库的操作方式二

dify数据库的操作方式 基础环境安装修改sanbox增加以来代码执行执行 基础环境安装 基础环境安装 修改sanbox增加以来 # 在线方式 # 修改volumes/sandbox/dependencies/python-requirements.txt mysql-connector-python# 离线方式 # 下载https://mirrors.aliyun.com/pypi/pac…

嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?

01 什么是 BootLoader 呢? 它是个引导程序,也就是硬件复位以后第一个要执行的程序,它主要工作就是初始化操作系统运行的环境,比如说内存、定时器、缓冲器等,当这个工作做完以后,再把操作系统的代码加载…

使用 .NET Core 实现 RabbitMQ 消息队列的详细教程

RabbitMQ 是一个流行的消息队列中间件,它允许应用程序通过异步消息的方式进行通信。RabbitMQ 支持 AMQP 协议,可以通过多种方式与应用程序交互。在本教程中,我们将深入探讨如何在 .NET Core 环境中使用 RabbitMQ 来实现消息队列。我们将学习如…

Mysql的库操作

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 简单数据库操作 1.1 查看数据库 1.2 创建数据库 1.3 使用数据库 …

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…