Spring 源码硬核解析系列专题(五):Spring Boot 自动装配的原理

news/2025/2/26 13:19:31

在前四期及扩展篇中,我们深入探讨了 Spring 的 IoC 容器、Bean 创建、AOP 和事务管理,这些是 Spring 框架的基石。而 Spring Boot 作为 Spring 的进化版,通过自动装配大幅简化了开发流程。本篇将聚焦 Spring Boot 的自动装配机制,揭秘其如何通过源码实现“约定优于配置”的哲学。

1. 自动装配的本质

Spring Boot 的自动装配(AutoConfiguration)是一种条件化的 Bean 配置机制。它通过预定义的配置类,根据项目依赖和环境动态加载所需的 Bean,避免手动配置。例如,引入 spring-boot-starter-web 后,Spring Boot 自动配置 DispatcherServlet 和 Tomcat,无需显式声明。

核心问题:

  • 如何判断需要加载哪些配置?
  • 如何实现条件化装配?

答案在于 @SpringBootApplicationspring.factories

2. @SpringBootApplication 的秘密

一个典型的 Spring Boot 应用从以下代码开始:

java">@SpringBootApplication
public class MyApplication {
   
    public static void main(String[] args) {
   
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication 是一个复合注解,包含:

  • @SpringBootConfiguration:标记为配置类,等价于 @Configuration
  • @EnableAutoConfiguration:启用自动装配。
  • @ComponentScan:扫描组件。

2.1 @EnableAutoConfiguration 的作用

@EnableAutoConfiguration 是自动装配的入口,其定义如下:

java">@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
   }
  • @Import 引入了 AutoConfigurationImportSelector,负责加载自动配置类。

3. AutoConfigurationImportSelector 的核心逻辑

AutoConfigurationImportSelectorselectImports() 方法是自动装配的关键:

java">@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   
    if (!isEnabled(annotationMetadata)) {
   
        return NO_IMPORTS;
    }
    AutoConfig

http://www.niftyadmin.cn/n/5868748.html

相关文章

docker部署GPU环境

使用 Docker 部署 GPU 环境涉及到几个关键步骤,以下是详细步骤: 1. 安装 NVIDIA 驱动程序 确保你的系统已经安装了 NVIDIA GPU 驱动。这是使用 GPU 的前提条件。 2. 安装 Docker 和 nvidia-container-toolkit 首先,确保你已经安装了 Docker。然后,安装 NVIDIA Containe…

关于vue中el-date-picker type=daterange日期不回显的问题

在构建现代化的前端应用时,使用Element UI框架的el-date-picker组件可以帮助我们快速实现日期选择功能。然而,在处理日期范围选择(daterange)时,可能会遇到日期数据从后端获取并试图回显到前端界面时出现的问题。 一、…

HPE Aruba Networking推出全新解决方案助力零售商增强物联网数据收集与边缘处理能力

全新网络连接解决方案助力IT 团队加强对零售环境的保护与管理,提升物联网(IoT)安全性,同时优化用户体验与运营效率 纽约 — 2025年2月25日 —慧与科技(NYSE: HPE)日前宣布推出全新功能,借助高效的网络连接和高性能边缘计算,助力零售商提升客户体验与运营效率,从而进一步打造零…

高版本k8s文件无法识别镜像

Kubernetes 1.24 正式移除了 dockershim 组件,意味着原生 Docker 容器运行时不再直接支持。集群管理员需要迁移至其他兼容的容器运行时,如 containerd 或 CRI-O。 高版本k8s不在支持docker运行容器运行服务,而使用ctr命令来识别pod文件的镜像…

好用的Docker项目:本地部署IOPaint打造专属在线图片处理工作站

文章目录 前言1.什么是IOPaint?2.本地部署IOPaint3.IOPaint简单实用4.公网远程访问本地IOPaint5.内网穿透工具安装6.配置公网地址7.使用固定公网地址远程访问总结 前言 在这个快节奏的时代,一张完美的照片往往能带来意想不到的效果。但有时候&#xff0…

【探寻C++之旅】第六章:STL

请君浏览 前言1. STL简介2. auto和范围for2.1 auto关键字2.2 范围for 3. string类3.1 string类对象的常见构造3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.4 string类非成员函数3.6 vs下string的结构 4. vector4.1 vector的构造4.…

Python 3.11 69 个内置函数(完整版)

一、数学与数值运算(12个) 函数 说明 示例 abs(x) 绝对值 abs(-5)→ 5 divmod(a, b) 返回(a//b, a%b) divmod(7,3)→ (2,1) max(iterable) 最大值 max([1,2,3])→ 3 min(iterable) 最小值 min([1,2,3])→ 1 pow(a, b) a^b(等…

10道Redis常见面试题速通

引言 本系列聚焦频率最高的面试题,用最简洁的文字表达中心思想,速通面试 1、Redis持久化数据和缓存怎么做扩容? 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使…