SpringBoot自动配置原理总结
1、我们需要从主启动类的@SpringBootApplication注解开始分析:
@SpringBootApplication是一个复合注解,进入以后看到主要包括以下三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
复制
2、这三个注解的功能如下:
@SpringBootConfiguration:底层还是一个@Configuration,代表当前是一个配置类。
@ComponentScan:指定组件扫描的类型和范围。
@EnableAutoConfiguration:开启自动配置,这个注解是自动配置的重点
3、进入@EnableAutoConfiguration可看到:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
复制
@AutoConfigurationPackage作用:自动配置包,指定类默认的包规则。具体来说就是利用Registrar将指定包(主启动类所在包)下的一系列组件导入到容器中。
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
复制
@Import(AutoConfigurationImportSelector.class)作用:
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件 2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类 3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件 4、从META-INF/spring.factories位置来加载一个文件。默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件。
重点就是扫描spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面的META-INF/spring.factories,文件里面写死了spring-boot一启动就要给容器中加载的所有配置类,总共127个。(!!!注意:这个个数的话,不同的版本是不同的,spring-boot-autoconfigure-2.6.4.jar是133个!!!)
4、按需开启自动配置项
虽然这127个场景的所有自动配置在启动的时候默认全部加载。但不会全部生效。最终某一个xxxxAutoConfiguration会按照条件装配规则(@Conditional)进行生效,实现按需开启。
5、修改默认配置
springboot非常细心和人性化,为了防止有些用户的配置不符合规范,springboot会通过代码将其强制规范,如下面文件上传解析器的例子,若用户定义的上传解析器的名字不是multipartResolver,经过下面的代码后,会强制命名为multipartResolver:
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;
}
复制
6、用户可自定义组件的配置
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了的话,就以用户的优先。
7、总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件。
- 用户直接去配置文件进行修改。
相关文章:
SpringBoot自动配置原理总结
1、我们需要从主启动类的SpringBootApplication注解开始分析: SpringBootApplication是一个复合注解,进入以后看到主要包括以下三个注解: SpringBootConfiguration EnableAutoConfiguration ComponentScan(excludeFilters { Filter(type …...
【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
内核对象和两种同步
概念 Windows 中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进 行访问 它的所有者:内核对象的所有者是操作系统内核,而非进程,也就是说当进程退出,内核对象不一定会销毁 法…...
水表远程监控系统有什么功能吗?
水表远程监控系统是通过远程传输水表数据,实现对水表的远程监控和管理的一种智能化系统。它主要具备以下功能: 1.远程抄表功能:通过远程传输技术,实现对水表的远程抄表和监控,无需人工上门抄表,节省人力成本…...
zabbix自定义监控
一、案例操作:自定义监控内容 案列:自定义监控客户端服务器登录的人数 需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1、自定义监控内容的操作步骤 1.1 在客户端创建自定义 key 明确需要执行的 linux 命令 who | …...
【AUTOSAR】Com通讯栈配置说明(四)---- Nm模块
Nm模块 NmGlobalConfig NmGlobalConstants NmRxIndicationCallback: callback 函数 NmCycletimeMainFunction:Nm 主函数调用周期 NmDevErrorDetect: 是否支持DET NmVersionInfoApi: 是否支持获取版本信息api PduR模块 PduRBswModules PduRBswModuleRef:关联的BS…...
IMG CXM GPU:面向复杂消费级设备的无缝视觉体验
上周我们推出了一款新的GPU,即IMG CXM。它的三种配置可扩展,为可穿戴设备和高级数字电视等多种消费设备提供无缝用户界面。 消费级设备需要GPU提供什么? 涵盖智能手表和智能眼镜的可穿戴市场为移动中的消费者提供了易于访问的信息。鉴于屏幕尺…...
Kafka如何保证数据高可靠
Kafka它本身其实不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉…...
OpenWRT 中修改SSID的文件
文件位置:/....../package/ramips/drivers/mt7628/files/mt7628.sh //---------------------------------------------文件中option ssid处修改如下: detect_mt7628() { # detect_ralink_wifi mt7628 mt7628 ssidmt7628-ifconfig eth0 | grep H…...
如何在 Linux 中进行网络地址转换 (NAT)?
网络地址转换(Network Address Translation,简称NAT)是一种在网络中使用的技术,它允许将私有网络中的IP地址映射到公共网络上,从而实现多个设备共享单个公共IP地址。在Linux系统中,我们可以使用一些工具和配…...
redis的使用第一章
下载地址:http://redis.io/download 安装步骤: 1.安装gcc yum install gcc2.把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis‐5.0.3.tar.gz tar xzf redis‐5.0.3.tar.gz cd r…...
基于springboot+vue的校园二手交易市场
一、项目背景介绍: 校园二手交易市场是大学生生活中的重要组成部分,它为学生提供了一个便捷的方式来买卖物品。然而,传统的校园二手交易方式存在着信息不对称、交易风险高等问题。为了解决这些问题,基于Spring Boot和Vue的校园二手…...
【CH32】| 01——新建工程 | 下载 | 运行 |调试
系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 失败了也挺可爱,成功了就超帅。 文章目录 1. 新建工程1.1 基于官方IDE [MounRiver Studio]1.1.1 使用官方内置的工程模板新建1.1.2 使用自定义工程模板新建1.1.2.1 新建自…...
【Netty】Promise 源码分析(十七)
文章目录 前言一、Promise 接口二、Netty 的 DefaultPromise2.1、设置任务的成功或失败2.2、获取 Future 任务执行结果和添加监听事件 三、Netty 的 DefaultChannelPromise总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计&…...
测牛学堂:2023最新自动化软件测试教程之python基础(字符串常用api总结)
python字符串常用API总结 1 count 查找某个字符在整个字符串中出现的次数 2 capitalize 将字符串的第一个字符转换为大写 3 center(width,fillchar) 返回一个指定宽度的字符串,fillchar为填充的字符,默认是空格,常用* str1 分隔线 print(st…...
【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)
、 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭…...
MQTT GUI 客户端 可视化管理工具
MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多支持 MQTT v5.0 以及 MQTT v3.1.1 协议,支持通过 WebSocket 连接至 MQTT 服务器以树…...
计算机硬件系统 — 冯诺依曼体系结构运行原理解析
目录 文章目录 目录计算机系统计算机硬件系统(冯诺依曼体系结构)PC 主机硬件CPU(中央处理器)CPU 的组成部分CPU 总线控制器单元运算器单元寄存器组超线程与多核架构三级高速缓存为什么需要缓存三级缓存结构 CPU 的指令集指令集的类…...
10.Linux查看文件内容
在 Linux 中,可以使用多种命令来查看文件内容。以下是几个常用的命令及其用法: cat 命令:以行为单位显示整个文件内容。 cat file.txt # 显示名为 file.txt 的文件内容less 命令:分页显示文件内容,可向前/后翻页、搜索…...
API接口测试—详情版(拼多多根据ID取商品详情)
一、为什么要做接口测试 做接口测试的原因主要有以下几个方面: 1. 确保接口功能正确性:接口是不同软件系统或者不同模块之间的数据传输和交互的通道,通过接口测试能够确保不同系统或者模块之间传递的信息准确无误,从而保证了整个…...
Cosm算法突破:Gset最大Ising问题求解新纪元
1. Cosm算法突破:Gset最大Ising问题求解新纪元在组合优化领域,Gset基准问题集已经困扰了研究者25年之久。这些看似简单的数学问题背后,隐藏着从无人机集群实时决策到超大规模集成电路设计等众多实际应用的优化需求。作为NP难问题的典型代表&a…...
内连接,左连接,右连接怎么区别开来?
区分这三种连接其实非常简单,核心就在于看**“谁的数据必须全部保留,谁的数据没有匹配就要被过滤掉”**。 为了让你彻底搞懂,我们可以把 user 表(用户)和 orders 表(订单)想象成两个班级&#x…...
神经符号系统实践手记:可微逻辑层与梯度重定向实现
1. 这不是又一个“AI综述”,而是一份可拆解、可复现的神经符号系统实践手记“Neurosymbolic AI”这个词,过去三年在顶会论文标题里出现频率翻了四倍,但真正能说清“我在哪一步调用了符号规则”“我的反向传播怎么和逻辑推理共存”的人&#x…...
STM32G4项目实战:巧用MCP2518FD实现多路CAN FD通信,附完整工程源码解析
STM32G4项目实战:巧用MCP2518FD实现多路CAN FD通信,附完整工程源码解析 在工业控制和车载网络领域,CAN FD总线因其更高的传输速率和更大的数据负载能力正逐步取代传统CAN总线。STM32G4系列微控制器内置3路FDCAN接口,但面对需要5路…...
Day03 Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响
我的博客园笔记 一、WebWAF WAF(Web应用防火墙):是一种专门设计用于保护 Web 应用程序免受恶意攻击的安全设备,它能够实时监控、过滤和拦截可能对网站造成危害的网络流量,从而避免网站服务器被恶意入侵,导…...
Puerts在UE5中实现TypeScript与蓝图无缝交互的实战指南
1. 这不是“加个插件就能用”的事:为什么Puerts在UE5里常被低估又频繁踩坑我第一次在UE5.1项目里集成Puerts时,以为照着GitHub README跑完C编译、TS声明生成、蓝图调用三步就能收工。结果花了整整三天——不是卡在编译失败,而是卡在“调用成功…...
把AI的能力拆成乐高积木:如何让Agent真正干成复杂的事
【AI Agent能不能干成复杂的事,不取决于模型有多聪明,而取决于能力怎么编排】AI Agent在2025年成为企业数字化领域的最热词汇。几乎所有企业都在讨论"上Agent",但真正落地之后,大家发现一个尴尬的现实:简单的…...
别再只会用默认库了!用OrCAD Capture CIS高效创建Homogeneous与Heterogeneous复合器件
高效设计复杂芯片:OrCAD Capture CIS中Homogeneous与Heterogeneous器件的进阶实践 在电子设计领域,面对日益复杂的芯片架构,工程师们常常陷入一个两难境地:当芯片包含多个功能单元时,是应该逐个绘制每个部分ÿ…...
modelzoo:昇腾 NPU 的“模型仓库”
modelzoo:昇腾 NPU 的“模型仓库” 之前帮朋友看模型训练的代码,发现他自己手写了很多模型(ResNet50/BERT/LLaMA2 等)——光写模型定义就写了 5,000 行,而且还不一定对。 我告诉他:不用手写,用 …...
AIAgent 才是 Hermes Agent 的“总调度器”:run_agent.py 在系统里到底负责什么?
一、先给结论:AIAgent 不是“大模型”,而是“任务总控台”很多人第一次看 Hermes Agent,容易把核心误解成“调用某个大模型的代码”。但从官方文档和源码结构看,真正的核心不是模型本身,而是 run_agent.py 里的 AIAgen…...
