Spring Boot 自动配置原理:从入门到精通

article/2025/6/7 12:30:00

Spring Boot 的自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发,让开发者可以专注于业务逻辑,而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理,帮助你理解其工作机制,并能灵活运用到实际项目中。

## 1. 什么是 Spring Boot 自动配置?

Spring Boot 自动配置是指 Spring Boot 能够根据项目中的依赖和配置,自动配置 Spring 应用所需的各种 Bean,例如数据源、Web 服务器、消息队列等。 简单来说,就是 Spring Boot 能够“猜测”你需要的配置,并自动帮你完成。

**优点:**

* **简化配置:** 减少了手动配置 Bean 的工作量。

* **提高开发效率:** 开发者可以专注于业务逻辑,无需花费大量时间在配置上。

* **约定优于配置:** Spring Boot 遵循“约定优于配置”的原则,提供了一套默认的配置,开发者可以根据需要进行自定义。

## 2. 自动配置的入口:`@EnableAutoConfiguration`

`@EnableAutoConfiguration` 注解是开启 Spring Boot 自动配置的入口。 通常,它会被添加到主应用程序类上,例如: 

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}

@SpringBootApplication 注解实际上是一个组合注解,包含了 @EnableAutoConfiguration@ComponentScan 和 @Configuration

3. 自动配置的核心:AutoConfiguration.imports

@EnableAutoConfiguration 注解会导入 AutoConfigurationImportSelector 类,该类负责扫描 classpath 下所有 jar 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件 1。

AutoConfiguration.imports 文件中包含了所有需要自动配置的类的全限定名,例如:

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

Spring Boot 会读取这些类,并根据一定的条件来决定是否加载它们。

4. 条件装配:@Conditional 注解

Spring Boot 使用 @Conditional 注解来实现条件装配。 @Conditional 注解可以根据不同的条件来决定是否加载一个 Bean。 常用的 @Conditional 派生注解包括:

  • @ConditionalOnClass:当 classpath 下存在指定的类时,才会加载 Bean。
  • @ConditionalOnMissingBean:当 Spring 容器中不存在指定的 Bean 时,才会加载 Bean。
  • @ConditionalOnProperty:当指定的配置属性存在时,才会加载 Bean。
  • @ConditionalOnWebApplication:当应用是 Web 应用时,才会加载 Bean。

示例:DataSourceAutoConfiguration

DataSourceAutoConfiguration 类用于自动配置数据源。 它使用了 @ConditionalOnClass 和 @ConditionalOnMissingBean 注解:

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {@Bean@ConfigurationProperties("spring.datasource")public DataSource dataSource() {return DataSourceBuilder.create().build();}
}
  • @ConditionalOnClass(DataSource.class):只有当 classpath 下存在 javax.sql.DataSource 类时,才会加载 DataSourceAutoConfiguration 类。 这意味着只有当项目中引入了数据库驱动时,才会自动配置数据源。
  • @ConditionalOnMissingBean(DataSource.class):只有当 Spring 容器中不存在 DataSource 类型的 Bean 时,才会创建 DataSource Bean。 这意味着如果开发者手动配置了数据源,Spring Boot 就不会自动配置数据源。

5. 自动配置的流程

下面是 Spring Boot 自动配置的流程图:

流程说明:

  1. 应用启动时,@EnableAutoConfiguration 注解生效。
  2. @EnableAutoConfiguration 注解导入 AutoConfigurationImportSelector 类。
  3. AutoConfigurationImportSelector 类扫描 classpath 下所有 jar 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。
  4. AutoConfigurationImportSelector 类加载 AutoConfiguration.imports 文件中指定的自动配置类。
  5. Spring Boot 根据自动配置类上的 @Conditional 注解判断是否需要注册 Bean。
  6. 如果条件成立,则注册 Bean;否则,跳过该自动配置类。
  7. 应用启动完成。

6. 自定义自动配置

虽然 Spring Boot 提供了大量的自动配置类,但在某些情况下,我们可能需要自定义自动配置。 自定义自动配置的步骤如下:

  1. 创建一个配置类,并使用 @Configuration 注解进行标注。
  2. 使用 @Conditional 注解来指定自动配置的条件。
  3. 在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中添加自定义配置类的全限定名。

示例:自定义 HelloService 自动配置

  1. 创建 HelloService 接口和实现类:
    public interface HelloService {String sayHello(String name);
    }public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name + "!";}
    }

  2. 创建 HelloServiceAutoConfiguration 类:
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class HelloServiceAutoConfiguration {@Bean@ConditionalOnMissingBean(HelloService.class)public HelloService helloService() {return new HelloServiceImpl();}
    }

  3. 在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中添加 HelloServiceAutoConfiguration 类的全限定名:
    com.example.autoconfigure.HelloServiceAutoConfiguration

    现在,当 Spring Boot 应用启动时,会自动配置 HelloService Bean,除非开发者手动配置了 HelloService Bean。

7. 总结

Spring Boot 自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发。 理解 Spring Boot 自动配置的原理,可以帮助我们更好地使用 Spring Boot,并能灵活运用到实际项目中。

希望本文能够帮助你理解 Spring Boot 自动配置的原理。 如果你有任何问题,欢迎留言讨论。


http://www.hkcw.cn/article/dSUpkQsWPM.shtml

相关文章

网络原理1

协议 在网络通信中,协议是非常重要的概念。协议是在网络通信过程中的约定。发送方和接收方需要提前商量好数据的格式,才能确保正确进行沟通。 应用层协议 应用层,对应着应用程序,是跟我们程序员打交道最多的一层。调用操作系统…

【JSON-to-Video】设置背景视频片断

欢迎来到JSON转视频系列教程。今天要教大家如何添加背景视频片断,在视频制作中,巧妙运用背景视频,能为作品增添独特魅力。下面就为大家详细讲解具体步骤。 JSON转视频教程,添加背景视频片断 设置bgVideo字段 {"bgVideo"…

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线

一、方案背景​ 在工地、矿山、工厂等高危作业场景,反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题,难以实现实时监管。AI智能分析网关V4基于人工智能技术,可自动识别人员着装状态,精准定位未穿反光衣…

Java垃圾回收机制深度解析:从理论到实践的全方位指南

Java垃圾回收(GC)是Java虚拟机(JVM)的核心功能,它自动管理内存分配与回收,避免了C/C中常见的内存泄漏问题。本文将深入剖析Java垃圾回收的工作原理、算法实现、收集器类型及调优策略,助你全面掌握JVM内存管理的精髓。 一、垃圾回收基础概念 …

实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题。主要涉及方差分析。 YieldDesign <-expand.grid(A gl(3, 1, labels c("-", "0","…

Vue内置组件Teleport和Suspense

一. Vue内置组件Teleport 认识Teleport( teleport&#xff1a;允许我们把组件的模板渲染到特定的元素上) 1.1. 在组件化开发中&#xff0c;我们封装一个组件A&#xff0c;在另外一个组件B中使用 组件A中template的元素&#xff0c;会被挂载到组件B中template的某个位置&#xf…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用 LS-DYNA 进行冲击性能分析

附件下载 联系工作人员获取附件 该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用 Ansys Mechanical 和 LS - DY…

windows可视化粘贴使用剪贴板

复制 ctrl c可视化粘贴 win v选择要粘贴的内容

【QT】认识QT

文章目录 1. 认识Qt2. 创建QT项目3. 认识对象树4. 其它4.1 窗口坐标系4.2 快捷键 1. 认识Qt 什么是QT Qt 是⼀个跨平台的C图形用户界⾯应用程序框架。 它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供…

OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建一个 基于最小特征值&#xff08;Minimum Eigenvalue&#xff09;的角点响应计算对象&#xff0c;这是另一种经典的角点检测方法&…

Java高级 | (二十二)快速应用开发框架——Spring Boot

一、使用IDEA搭建SpringBoot项目 二、创建控制器类 1、先运行项目。 如果配置正常&#xff0c;ldea运行界面如下&#xff0c;表示启动正常。 2、创建控制器类 鼠标右击controller包&#xff0c;点击new->Java Class,在弹出的对话框中输入“HelloController”并按回车健&a…

Linux 安装 JDK

Linux中JDK安装 文件路径在root目录&#xff0c;请根据实际情况进行修改 1、上传并解压 tar -zxvf /root/jdk-8u333-linux-x64.tar.gz2、移动解压后的文件夹到/usr/local 目录下&#xff0c; mv /root/jdk1.8.0_333 /usr/local/此步骤可以不操作&#xff0c;但步骤3中的路径…

简简单单探讨下starter

前言 今天其实首先想跟大家探讨下&#xff1a;微服务架构&#xff0c;分业务线了&#xff0c;接入第三方服务、包啥的是否自己定义一个stater更好&#xff1f; 一、starter是什么&#xff1f; 在 Spring Boot 中&#xff0c;Starter 是一种特殊的依赖模块&#xff0c;用于快速…

字符编码全解析:ASCII、GBK、Unicode、UTF-8与ANSI

UTF - 8(全球字符能被唯一标识)、GBK、Unicode、ANSI 区别与关联 qwen模型分词器文件 1. ASCII(基础铺垫,理解编码起源) 作用:最早期为处理英文文本设计,是字符编码的基础,后演变成其他编码兼容的一部分 。范围:共 128 个字符(0 - 127),包含英文大小写字母、数字…

定时线程池失效问题引发的思考

最近在做的一个新功能&#xff0c;在结果探测的时候使用了定时线程池和普通线程池结合&#xff0c;定时线程池周期性创建子任务并往普通线程池提交任务。 问题&#xff1a; 在昨天测试老师发现&#xff0c;业务实际上已经成功了&#xff0c;但是页面还是一直显示进行中。 收到…

Win11/Win10 打不开 gpedit.msc 之 组策略编辑器安装

目前已整理两种方式&#xff0c;推荐使用第二种方式~ 方式1&#xff1a; 一般家庭版操作系统默认未安装 组策略编辑器&#xff0c; 只需要进行安装一下即可。 到文章结尾按照提示下载相关的bat文件&#xff0c; 下载后右键以管理员身份运行bat文件&#xff0c;&#xff08…

无人机甲烷检测技术革新:开启环境与能源安全监测新时代

市场需求激增&#xff0c;技术革新势在必行 随着全球气候变化加剧&#xff0c;甲烷作为第二大温室气体&#xff0c;其减排与监测成为国际社会关注焦点。据欧盟甲烷法规要求&#xff0c;2024 年起欧洲能源基础设施运营商需定期测量甲烷排放并消除泄漏。与此同时&#xff0c;极端…

谷歌地图手机版(Google maps)v11.152.0100安卓版 - 前端工具导航

谷歌地图(Google maps)是由谷歌官方推出的一款手机地图应用。软件功能强大&#xff0c;支持本地搜索查找世界各地的地址、地点和商家&#xff1b;支持在街景视图中查看世界各地的360度全景图&#xff1b;支持查找乘坐火车、公交车和地铁的路线&#xff0c;或者查找步行路线等 …

H5动态文字效果开发经验分享

这里写目录标题 一、效果介绍二、实现原理与代码解析1. 打字机效果实现2. 渐变文字动画实现 三、开发经验与技巧1. 性能优化2. 兼容性处理3. 用户体验提升 四、应用场景五、扩展思路 一、效果介绍 我们实现了两种常见且实用的文字动效&#xff1a; 打字机效果 &#xff1a;文…