Spring Boot到底是如何进行自动配置的?
【1】从 spring.factories
配置文件中加载 EnableAutoConfiguration
自动配置类),获取的自动配
置类如图所示。
【2】若 @EnableAutoConfiguration
等注解标有要 exclude
的自动配置类,那么再将这个自动配置类
排除掉;
【3】排除掉要 exclude
的自动配置类后,然后再调用 filter
方法进行进一步的过滤,再次排除一些
不符合条件的自动配置类;
【4】经过重重过滤后,此时再触发 AutoConfigurationImportEvent
事件,告诉
ConditionEvaluationReport
条件评估报告器对象来记录符合条件的自动配置类;
【5】 最后再将符合条件的自动配置类返回。
AutoConfigurationImportSelector
的 filter
方法主要做的事情就是调用
AutoConfigurationImportFilter
接口的 match
方法来判断每一个自动配置类上的条件注解(若有
的话) @ConditionalOnClass
, @ConditionalOnBean
或 @ConditionalOnWebApplication
是否满足
条件,若满足,则返回true,说明匹配,若不满足,则返回false说明不匹配。
我们再总结下SpringBoot自动配置的原理,主要做了以下事情:
1. 从spring.factories
配置文件中加载自动配置类;
2. 加载的自动配置类中排除掉 @EnableAutoConfiguration
注解的 exclude
属性指定的自动配置
类;
3. 然后再用 AutoConfigurationImportFilter
接口去过滤自动配置类是否符合其标注注解(若有
标注的话) @ConditionalOnClass
, @ConditionalOnBean
和
@ConditionalOnWebApplication
的条件,若都符合的话则返回匹配结果;
4. 然后触发 AutoConfigurationImportEvent
事件,告诉 ConditionEvaluationReport
条件评
估报告器对象来分别记录符合条件和 exclude
的自动配置类。
5. 最后spring再将最后筛选后的自动配置类导入IOC容器中
GPT回答:
Spring Boot的自动配置是通过条件化配置(Conditional Configuration)和约定优于配置(Convention over Configuration)的原则来实现的。
-
条件化配置:Spring Boot会根据当前应用的环境和类路径上的依赖,判断是否需要自动配置某个组件。它会通过条件注解(如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等)来定义条件,只有在满足条件的情况下才会进行自动配置。
-
约定优于配置:Spring Boot根据一些约定来进行自动配置,而不需要显式的配置。它会根据类路径上的依赖、配置文件、注解等信息,自动推断和加载合适的配置。比如,如果在类路径上存在HikariCP依赖,Spring Boot会自动配置HikariCP作为默认的数据库连接池。
在自动配置过程中,Spring Boot会扫描应用程序的类路径上的META-INF/spring.factories文件,该文件中定义了各个自动配置类的全限定名。Spring Boot会根据这些配置类来进行自动配置。
自动配置类通常使用@Configuration注解进行标注,并且使用各种注解(如@Bean、@EnableConfigurationProperties等)来进行具体的配置。这些自动配置类会根据条件判断来决定是否进行自动配置。
另外,Spring Boot还提供了@ConfigurationProperties注解,用于将配置文件中的属性值绑定到对应的Java对象上。通过@ConfigurationProperties注解,我们可以方便地自定义配置,并在自动配置过程中使用。
总之,Spring Boot的自动配置通过条件化配置和约定优于配置的原则,根据应用的环境、依赖和配置文件等信息,自动加载和配置相应的组件,以简化开发者的配置工作。
相关文章:

Spring Boot到底是如何进行自动配置的?
【1】从 spring.factories 配置文件中加载 EnableAutoConfiguration 自动配置类),获取的自动配 置类如图所示。 【2】若 EnableAutoConfiguration 等注解标有要 exclude 的自动配置类,那么再将这个自动配置类 排除掉; 【3】排除掉要 exclude …...

【王道数据结构】【chapter7查找】【P285t5】
线性表中各节点的检索概率不等时,可用如下策略提高顺序检索的效率;若找到指定的结点,则将该结点和其前驱结点(若存在)交换,使得经常被访问的结点尽量位于表的前端。试设计在顺序结构和链式结构的线性表盘上…...

个人玩航拍,如何申请无人机空域?
我们在《年会不能停》一文中,有分享我们在西岭雪山用无人机拍摄的照片和视频,有兴趣可以去回顾。 春节的时候,趁着回老家一趟,又将无人机带了回去,计划拍一下老家的风景。 原本以为穷乡僻壤的地方可以随便飞…...

ChatGPT带火的HBM是什么?
“ChatGPT是人工智能领域的iPhone时刻,也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火,对大算力芯片提出了更高更多的要求。近日,据韩国经济日报报道,受惠于ChatGPT&am…...

10 款数据恢复软件功能和有效性对比(2024 年更新)
数据丢失可能是一种痛苦的经历,无论是由于意外删除、硬件故障还是软件损坏。值得庆幸的是,数字时代带来了强大的数据恢复解决方案。 随着我们进入 2024 年,市场上充斥着旨在有效检索丢失数据的先进软件。在本文中,我们将探讨 2024…...
Python 与 pdfplumber:高效自动读取 PDF 的解决方案
在许多数据处理和信息提取任务中,处理 PDF 文件可能是一个具有挑战性的过程。幸运的是,Python 提供了许多库来简化这个任务,其中 pdfplumber 是一个功能强大且易于使用的库。在本文中,我们将探讨如何使用 Python 和 pdfplumber 库…...
Flutter 启动流程解析
任何应用程序都是从main()开始的,Flutter也不例外。Flutter 的启动入口在 lib/main.dart 里的 main() 函数中,代码如下。 void main() => runApp(MyApp());void runApp(Widget app) {final WidgetsBinding binding = WidgetsFlutterBinding.ensureInitialized();assert(b…...
全量知识系统问题及SmartChat给出的答复 之4
Q11. 现在,我们进一步完善前端--知识表征。首先前端需要基于一个全面的GUI库,和前面说到的 混沌工程:基于流形 的分形混沌 与自相似性的计算机图像与程序。请考虑 1)这两部分的实现用什么 ?2) 如何封装它们…...
Java架构师之路七、大数据:Hadoop、Spark、Hive、HBase、Kafka等
目录 Hadoop: Spark: Hive: HBase: Kafka: Java架构师之路六、高并发与性能优化:高并发编程、性能调优、线程池、NIO、Netty、高性能数据库等。-CSDN博客Java架构师之路八、安全技术:Web安…...

图论基础(一)
一、图论 图论是数学的一个分支,它以图为研究对象。图论中的图是若干给定的点(顶点)以及连接两点的线(边)构成的图像,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,…...

使用 React 和 MUI 创建多选 Checkbox 树组件
在本篇博客中,我们将使用 React 和 MUI(Material-UI)库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据,并允许用户选择多个节点。 前提 在开始之前,确保你已经安装了以下依赖: Reac…...
vue3里面使用el-image-vie出现图片预览导致页面卡顿停止加载问题
需求:我们在使用element-plus组件里面的图片预览时候,通过点击按钮来实现图片预览的效果。在开发过程中我们会遇到图片预览的时候出现卡顿出不来,导致当前的页面停止加载了。 具体思路如下: 我们需要添加:preview-teleported“t…...

Leetcoder Day26| 回溯part06:总结+三道hard题
332.重新安排行程 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必…...

浅谈 Linux 网络编程 - 网络字节序
文章目录 前言核心知识关于 小端法关于 大端法网络字节序的转换 函数 前言 在进行 socket 网络编程时,会用到字节流的转换函数、例如 inet_pton、htons 等,那么为什么要用到这些函数呢,本篇主要就是对这部分进行介绍。 核心知识 重点需要记…...

Nginx网络服务六-----IP透传、调度算法和负载均衡
1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…...

【Linux进程】进程状态---进程僵尸与孤儿
📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.进程排队2.进程状态…...
MySQL数据库基础知识总结(适合小白入门使用)一
文章目录 一 数据库数据表的创建等基本操作二 数据类型的测试三 完整性约束条件四 数据表结构的相关操作五 对表中数据的操作六 表达式与查询七 高级的查询功能 一 数据库数据表的创建等基本操作 #注释内容(与python很像) -- 也为注释内容 -- 创建一个数…...

历史新知网:寄快递寄个电脑显示器要多少钱?
以下文字信息由(新史知识网)编辑整理发布。 让我们赶紧来看看吧! 问题1:快递寄电脑显示器要多少钱? 此物有多重? 顺丰寄就可以了,但是必须是原包装的,不然不好寄。 问题2࿱…...
在两台CentOS 7服务器上部署MinIO集群。
环境说明: 2台Centos7服务器 IP地址分别为172.16.1.9和172.16.1.10 1. 创建minio用户和目录 在两台服务器上执行以下命令: sudo useradd -m -d /app/minio minio sudo mkdir -p /app/minioData sudo mkdir -p /app/minio/logs sudo chown -R mini…...

【计算机网络】深度学习使用应用层的HTTP协议
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【计算机网络】深度学习使用应用层的HTTP协议 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 一:HTTP是什么二:HTTP请求1.HTTP请求的组成2.HTTP请求的方法…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...