重学SpringBoot3-自动配置机制
重学SpringBoot3-自动配置机制
- 引言
- Spring Boot 自动配置原理
- 示例:Spring Boot Web 自动配置
- 深入理解
- 总结
- 相关阅读
引言
Spring Boot 的自动配置是其最强大的特性之一,它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring Boot 的 “约定优于配置” 的设计理念。本教程将带你了解 Spring Boot 自动配置的背后原理,并通过示例解释其工作方式。
Spring Boot 自动配置原理
Spring Boot 自动配置的核心是一系列自动配置类,这些类通常基于类路径中的存在和属性值来条件性地配置应用程序。
主要步骤如下:
-
启动类:每个
Spring Boot应用都有一个启动类,通常使用@SpringBootApplication注解。这个注解是一个组合的注解,它包含了@EnableAutoConfiguration,后者是自动配置的关键。 -
@EnableAutoConfiguration:这个注解告诉
Spring Boot开始扫描候选自动配置类,并应用它们。这些候选自动配置类通常通过spring.factories文件存放,该文件位于自动配置模块的META-INF/目录下。 -
条件注解:自动配置类使用条件注解(如
@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等)来确保只有在特定条件满足时才应用配置。例如,某个自动配置类可能只在某个类存在于类路径上时才激活。 -
属性绑定:自动配置过程还涉及将外部配置(如
application.properties或application.yml)绑定到配置类上,进一步定制化自动配置。
相关源码:
从启动类开始

@SpringBootApplication注解其实包含三个注解,自动配置相关的是@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration:通过@Import导入自动配置模块的导入选择器AutoConfigurationImportSelector,它的作用是在启动时扫描指定包路径下的所有自动配置类,并根据应用程序的依赖关系和环境变量等信息,自动地选择需要引入的自动配置类,并将其注册为Bean,以便应用程序可以正常使用这些自动配置的功能。

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports:该方法的主要作用是从给定的注解元数据中筛选出需要导入的包名。

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry:用于获取自动配置项的入口点。该方法接受一个参数,即要获取的自动配置项的名称。它返回一个AutoConfigurationEntry对象,该对象包含了自动配置项的详细信息,如类路径、Bean定义等。重点看该方法内调用的getCandidateConfigurations()方法。

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations:这个方法的作用是获取候选的自动配置类列表。

org.springframework.boot.context.annotation.ImportCandidates#load:通过调用ImportCandidates.load()方法,从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中加载候选的自动配置类,并将其存储在configurations变量中。

org.springframework.boot.autoconfigure.AutoConfiguration.imports:存放了SpringBoot自动配置类,不同SpringBoot版本数量不同。

回到
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry,会对读到所有的自动配置类进行筛选。

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.ConfigurationClassFilter#filter:筛选条件就是使用条件注解(如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等)来确保只有在特定条件满足时才应用配置。

例如符合筛选条件的
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration自动配置类,类上带有@EnableConfigurationProperties({ServerProperties.class}),既将配置文件(如application.properties或application.yml)中的属性绑定到带有@ConfigurationProperties注解的类ServerProperties.class对象上,从而达到引入starter配置少量参数就能运行的目的。

示例:Spring Boot Web 自动配置
假设你想创建一个简单的 Spring Boot Web 应用。你只需要做以下几步:
-
添加依赖:在
pom.xml或build.gradle文件中添加Spring Boot Starter Web依赖。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> -
创建启动类:
@SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} } -
编写控制器:
@RestController public class HelloController {@GetMapping("/")public String hello() {return "Hello, Spring Boot!";} } -
配置文件
server.port=8808
在这个例子中,spring-boot-starter-web 包含了 Spring MVC 和 Tomcat 作为默认的嵌入式服务器,以及其他 Web 开发所需的依赖。当你启动应用时,Spring Boot 的自动配置会检测到类路径上的 spring-webmvc 和嵌入式 Tomcat,并自动配置它们。这意味着你通过少量的配置或默认配置就可以运行一个基本的 Web 应用。
深入理解
-
自定义自动配置:如果默认的自动配置不符合你的需求,你可以通过添加自定义配置来覆盖或补充默认配置。此外,你也可以通过排除特定的自动配置类来禁用它们。
-
条件化配置:理解自动配置背后的条件逻辑对于高效使用
Spring Boot非常重要。你可以查看特定自动配置类的源码,以了解它们是如何根据应用的状态和外部配置做出决策的。
总结
Spring Boot 的自动配置极大简化了 Spring 应用的配置工作,让开发者可以专注于应用逻辑的实现,而非繁琐的配置。通过合理利用自动配置和条件注解,你可以快速地构建出既强大又灵活的 Spring 应用。了解并掌握 Spring Boot 自动配置的原理和使用方法,将有助于你更高效地开发 Spring Boot 应用。
相关阅读
重学SpringBoot3-@Import注解的作用
重学SpringBoot3-@ConditionalOnXxx条件注解
重学SpringBoot3-@ConditionalOnXxx条件注解
重学SpringBoot3-@EnableConfigurationProperties注解
相关文章:
重学SpringBoot3-自动配置机制
重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例:Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一,它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …...
sql基本语法+实验实践
sql语法 注释: 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…...
Node.js中的并发和多线程处理
在Node.js中,处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的,这意味着它在任何给定时间内只能执行一个任务。然而,Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中,我们将探讨…...
node.js 封装分页查询
node.js封装sql分页查询 方法: /*** 生成分页查询sql* param {string} table 表名* param {number} pageNum 分页页数 * param {number} pageSize 分页条数 * param {object} query 查询对象 例:{id:1,name:小明}* returns sql语句*/ const limit (ta…...
iptables 基本使用
iptables 主要用到两个表:filter 和 nat,其中 filter 表可以用来过滤数据包;nat 可以用来修改数据包的源地址和目的地址。 chain chain 是 table 中对数据包进行匹配的规则,对于 filter 来说 chain 有 INPUT & OUTPUT & …...
食品笔记()
吃东西有时不注意,就容易不舒服,记录下。 辣椒 辣椒真是个让人又爱又恨的东西。 看着想吃,吃着过瘾,吃完容易肚子疼。 主要是这东西本身就会刺激身体,即使是能吃辣的人,也容易造成肠胃发炎。 适量吃些即…...
C++入门和基础
目录 文章目录 前言 一、C关键字 二、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.3 标准命名空间 三、C输入&输出 四、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 五、函数重载 5.1 函数重载的简介 5.2 函数重载的分类 六、引用 6.1 引用的…...
一些C语言知识
C语言的内置类型: char short int long float double C99中引入了bool类型,用来表示真假的变量类型,包含true,false。 这个代码的执行结果是什么?好好想想哦,坑挺多的。 #include <stdio.h>int mai…...
代码工具APEX的入门使用(未包含安装)
第一次使用APEX是2019年,这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站,这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程,都是用APEX做的。 那一年,我用APEX做了一个CMDB的管理系统。那时候还没有流行…...
负载均衡.
简介: 将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…...
Git 指令深入浅出【2】—— 分支管理
Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…...
工作流/任务卸载相关开源论文分享
decima-sim 概述: 图神经网络强化学习处理多工作流 用的spark的仿真环境,mit的论文,价值很高,高被引:663仓库地址:https://github.com/hongzimao/decima-sim论文:https://web.mit.edu/decima/co…...
为什么要用Python?
为什么要用Python? Python简单易用:提供大量的简单易用数据结构和内置库,语法结构也很简单易读,不需要使用括号来进行代码块分组,也不需要预声明变量或参数。Python开发效率高:简单易用的前提下࿰…...
北京大学发布,将试错引入大模型代理学习!
引言:探索语言智能的新边界 在人工智能的发展历程中,语言智能始终是一个核心的研究领域。随着大语言模型(LLM)的兴起,我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…...
Java 设计模式
编程设计模式六大原则 开闭原则(Open Close Principle):对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好&#…...
Kivy和BeeWare 开发APP的优缺点,及其发展历史
Kivy和BeeWare都是流行的Python框架,用于开发移动应用。它们各自有独特的特点和优势,同时也面临一些挑战和限制。下面是对这两个框架的开发优缺点及其发展历史的总结。 Kivy 发展历史 起源:Kivy诞生于2010年,旨在提供一个用于P…...
C++递推
统计每个月兔子的总数 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){}猴子吃桃子 #include<b…...
C++ 面试题
一、基础语法 1. C 和 C的区别 i. C是面向对象的的编程语言,C是面向过程的编程语言 ii. C中的内存分配运算符是new/delete而C 中是malloc和free iii. C中有函数重载而C 中没有 iv. C中新增了引用的概念而C 中只有值和指针 2. struct 和 class的区别 i. struc…...
MySQL之索引详解
华子目录 索引概述优缺点 索引的原理索引的设计原则索引结构B-tree(多路平衡查找树)BtreeHash 为什么InnoDB存储引擎选择Btree?索引分类聚集索引选取规则 单列索引和多列索引前缀索引创建索引1.创建表时创建索引2.在已经存在的表上创建索引3.…...
Java面试题总结8:springboot
Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供,使用ConfigurationBean定义配置类,放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …...
Google I/O 2026之外,声网搞定弱网通话难题
作为每日穿梭地铁的通勤上班族,我对日常使用的 AI 工具,始终只有一个核心诉求,那就是弱网场景下运行稳定,不会轻易出现故障。此前观看 2026 谷歌开发者大会时,我便心生期许,盼望日常通勤途中,也…...
AI学习者的进度同步协议:Newsletter如何重构自学路径
1. 这不是一份普通 newsletter:它是一份 AI 学习者的“进度同步协议”“Learn AI Together — Towards AI Community Newsletter #14”——看到这个标题,别急着划走。它既不是某家大厂的公关通稿,也不是知识付费平台的引流钩子,更…...
VMware虚拟机创建详细教程(新手小白友好)
本教程以 VMware Workstation Pro 16/17 版本为例,演示如何创建一台新的虚拟机。第一步:启动新建虚拟机向导打开VMware Workstation,点击主界面上的 “创建新的虚拟机”,或依次点击菜单栏“文件” → “新建虚拟机”。图1 VMware创…...
【Typescript】11-类抽象类与面向对象建模
类、抽象类与面向对象建模 TypeScript 不是一门纯粹的面向对象语言,但它对类系统的支持足够完整,足以覆盖很多工程场景。问题在于,很多人学到 class 之后,会误以为这就是组织 TypeScript 代码的默认方式。现实恰恰相反࿱…...
P vs NP:西方哲学 × 西方计算理论 —— 人类思维的终极边界
P vs NP:西方哲学 西方计算理论 —— 人类思维的终极边界 华夏之光永存|七大数学猜想思维范式全链条 第一篇开篇 P vs NP 是计算机科学第一难题,克雷数学研究所七大千禧年难题之一。 本文不宣称证明、不跳步、不民科、不超纲。 只用哲学与数…...
2026 主流技术栈:hermes agent多环境安装配置:Windows/Mac/Linux
一、Hermes agent 大模型选择 Hermes Agent 通过统一的模型抽象层接入不同厂商的大语言模型服务。实际部署时,建议根据数据合规要求、任务类型和成本预算进行选型。 1.1 国内场景:Kimi K2.6 对于数据需境内处理或存在私有化部署需求的场景,…...
别再盯着大厂了,这3类“隐形冠军”公司才是技术人的归宿
在软件测试行业求职的浪潮中,几乎所有从业者的第一求职目标都锚定了互联网大厂:从BAT到新一代的字节、拼多多,从美团滴滴到华为阿里,大厂开出的高薪、响亮的title和完善的福利体系,始终吸引着一波又一波测试人挤破了头…...
Unity UGUI Mask与3D对象Stencil裁剪失效的根因解析
1. 这不是“Stencil失效”,而是 Unity 渲染管线里一场被忽略的层级静默冲突 你有没有试过在 UGUI ScrollView 里放一个带 Mask 的滚动区域,再把一个 3D 模型(比如一个带透明材质的粒子特效、或者一个半透的 UI 面板)叠在它上面&am…...
一个月 SQL 学习总结:LeetCode 高频 SQL 50 题刷题心得
最近花了一个月时间系统学习 SQL,主要是跟着 LeetCode 的「高频 SQL 50 题(基础版)」进行练习。 回过头来看,这一个月的学习虽然不算特别长,但让我对 SQL 的理解比以前清晰了很多,也积累了一些适合初学者的…...
【ChatGPT SEO写作黄金法则】:20年SEO专家亲授7大不可绕过的AI内容合规红线
更多请点击: https://kaifayun.com 第一章:ChatGPT SEO写作的底层逻辑与合规本质 ChatGPT SEO写作并非简单地将关键词堆砌进AI生成文本,其底层逻辑建立在三重耦合关系之上:搜索引擎语义理解机制、用户真实搜索意图建模࿰…...
