Spring (15)Spring Boot的自动配置是如何工作的
Spring Boot的自动配置是通过条件注解(如@ConditionalOnClass,@ConditionalOnBean等)和@EnableAutoConfiguration注解来实现的。这一机制主要是为了简化配置过程,让开发者在满足特定条件时自动配置Spring应用。接下来,我们会深入探讨这一机制是如何工作的,以及它的实现原理。
核心原理
自动配置的核心是@EnableAutoConfiguration注解。这个注解本质上是一个复合注解,它利用Spring框架的@Import注解来收集和注册自动配置类。
@EnableAutoConfiguration注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {// ...
}
通过@Import(AutoConfigurationImportSelector.class),EnableAutoConfiguration引入了自动配置的关键组件AutoConfigurationImportSelector。
AutoConfigurationImportSelector
AutoConfigurationImportSelector是实现自动配置魔法的关键。它会读取META-INF/spring.factories文件,这个文件位于自动配置模块的资源目录下,列出了可用的自动配置类。
public class AutoConfigurationImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[] {/* 自动配置类的全限定名列表 */};}
}
实际上,selectImports方法的实现更复杂,它会分析候选的配置类,只选择符合当前环境条件的配置类。
条件注解
自动配置类通常配合条件注解使用,这些注解定义了配置类生效的条件。如:
@ConditionalOnClass:当类路径上存在指定类时配置才生效。@ConditionalOnMissingBean:当容器中不存在指定Bean时配置才生效。@ConditionalOnProperty:当指定的配置属性有一个明确的值时配置才生效。
示例:DataSource自动配置
以DataSource的自动配置为例,来看看自动配置是如何实现的。
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {@Configuration@ConditionalOnProperty(name = "spring.datasource.type")public static class DataSourceConfiguration {// 省略配置方法...}
}
在这个示例中,DataSourceAutoConfiguration类上的@ConditionalOnClass注解确保了只有当DataSource和EmbeddedDatabaseType类在类路径上可用时,配置才会生效。@ConditionalOnMissingBean注解则确保只有当容器中不存在任何DataSource类型的Bean时,自动配置才会应用。
自动配置原理总结
- 启动类上的
@EnableAutoConfiguration注解:引入AutoConfigurationImportSelector。 AutoConfigurationImportSelector:读取META-INF/spring.factories文件,加载自动配置类。- 条件注解:根据环境(类路径、Bean容器、配置属性等)决定特定配置类是否生效。
这个机制有效地将常见配置的决策过程自动化,减少了开发者需要手动配置的数量,同时保留了灵活性,因为开发者可以通过创建或替换Beans、添加自己的配置类来覆盖默认的自动配置。
相关文章:
Spring (15)Spring Boot的自动配置是如何工作的
Spring Boot的自动配置是通过条件注解(如ConditionalOnClass,ConditionalOnBean等)和EnableAutoConfiguration注解来实现的。这一机制主要是为了简化配置过程,让开发者在满足特定条件时自动配置Spring应用。接下来,我们…...
【机器学习】—机器学习和NLP预训练模型探索之旅
目录 一.预训练模型的基本概念 1.BERT模型 2 .GPT模型 二、预训练模型的应用 1.文本分类 使用BERT进行文本分类 2. 问答系统 使用BERT进行问答 三、预训练模型的优化 1.模型压缩 1.1 剪枝 权重剪枝 2.模型量化 2.1 定点量化 使用PyTorch进行定点量化 3. 知识蒸馏…...
54. UE5 RPG 增加伤害类型
在正常的RPG游戏中,都存在一个类别就是属性伤害,比如,在一个游戏里面有一个火属性的技能,它造成的伤害就是火属性类型的,并且它还有可能有附加伤害,比如给予目标一个灼烧效果,每秒造成多少的火属…...
llama3 微调教程之 llama factory 的 安装部署与模型微调过程,模型量化和gguf转换。
本文记录了从环境部署到微调模型、效果测试的全过程,以及遇到几个常见问题的解决办法,亲测可用(The installed version of bitsandbytes was compiled without GPU support. NotImplementedError: Architecture ‘LlamaForCausalLM’ not sup…...
C++三剑客之std::any(二) : 源码剖析
目录 1.引言 2.std::any的存储分析 3._Any_big_RTTI与_Any_small_RTTI 4.std::any的构造函数 4.1.从std::any构造 4.2.可变参数模板构造函数 4.3.赋值构造与emplace函数 5.reset函数 6._Cast函数 7.make_any模版函数 8.std::any_cast函数 9.总结 1.引言 C三剑客之s…...
【C语言】8.C语言操作符详解(2)
文章目录 6.单⽬操作符7.逗号表达式8.下标访问[]、函数调⽤()8.1 [ ] 下标引⽤操作符8.2 函数调⽤操作符 9.结构成员访问操作符9.1 结构体9.1.1 结构的声明9.1.2 结构体变量的定义和初始化 9.2 结构成员访问操作符9.2.1 结构体成员的直接访问9.2.2 结构体成员的间接访问 6.单⽬…...
vivado 物理约束KEEP_HIERARCHY
KEEP_HIERARCHY Applied To Cells Constraint Values • TRUE • FALSE • YES • NO UCF Example INST u1 KEEP_HIERARCHY TRUE; XDC Example set_property DONT_TOUCH true [get_cells u1] IOB Applied To Cells Constraint Values IOB_XnYn UCF Examp…...
Linux 三十六章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要…...
ntsd用法+安装包
ntsd是一个强大的进程终止软件,除了少数系统进程之外一律杀掉 用法 1.ntsd -c q -p 进程的pid 2.ntsd -c q -pn 进程名 记得解压到System32里面 当然,资源管理器的进程是可以杀的所以也可以让电脑黑屏 同样可以让电脑黑屏的还有taskkill /f /im 进程…...
Nacos 微服务管理
Nacos 本教程将为您提供Nacos的基本介绍,并带您完成Nacos的安装、服务注册与发现、配置管理等功能。在这个过程中,您将学到如何使用Nacos进行微服务管理。下方是官方文档: Nacos官方文档 1. Nacos 简介 Nacos(Naming and Confi…...
Kubernetes集群上的Etcd备份和恢复
在本教程中,您将学习如何在Kubernetes集群上使用etcd快照进行etcd备份和恢复。 在Kubernetes架构中,etcd是集群的重要组成部分。所有集群对象及其状态都存储在etcd中。为了更好地理解Kubernetes,有几点关于etcd的信息是您需要了解的。 它是…...
创建型模式 (Python版)
单例模式 懒汉式 class SingleTon:# 类属性_obj None # 用来存储对象# 创造对象def __new__(cls, *args, **kwargs):# 如果对象不存在,就创造一个对象if cls._obj is None:cls._obj super().__new__(cls, *args, *kwargs)# 返回对象return cls._objif __name__…...
【收录 Hello 算法】9.4 小结
目录 9.4 小结 1. 重点回顾 2. Q & A 9.4 小结 1. 重点回顾 图由顶点和边组成,可以表示为一组顶点和一组边构成的集合。相较于线性关系(链表)和分治关系(树),网络关系(图&am…...
MYSQL数据库基础语法
目录 友情提醒第一章:数据库简述1)数据库简述2)常见的数据库软件3)MySQL数据库安装和连接4)SQL语句分类①DDL(Data Definition)②DML(Data Manipulation)③DQL࿰…...
R实验 参数检验(二)
实验目的:掌握正态分布和二项分布中,功效与样本容量之间的关系;学会利用R软件完成一个正态总体方差和两个正态总体方差比的区间估计和检验。 实验内容: (习题5.28)一种药物可治疗眼内高压,目的…...
【Linux】进程信号及相关函数/系统调用的简单认识与使用
文章目录 前言一、相关函数/系统调用1. signal2. kill3. abort (库函数)4. raise (库函数)5. alarm 前言 现实生活中, 存在着诸多信号, 比如红绿灯, 上下课铃声…我们在接收到信号时, 就会做出相应的动作. 对于进程也是如此的, 进程也会收到来自 OS 发出的信号, 根据信号的不同…...
Spring (14)什么是Spring Boot
Spring Boot是一个开源的Java基础框架,旨在简化Spring应用的创建和开发过程。Spring Boot通过提供一套默认配置(convention over configuration),自动配置和启动器(starters)来减少开发者的开发工作量和配置…...
区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测
区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…...
Java集合框架全景解读:从源码到实践精通指南
1. Java集合框架简介 在Java中,集合框架是用于存储和处理数据集合的一组类和接口。它提供了一系列的数据结构,比如列表(List)、集(Set)和映射(Map)。这些数据结构为开发者处理数据提…...
Python | Leetcode Python题解之第107题二叉树的层序遍历II
题目: 题解: class Solution:def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:levelOrder list()if not root:return levelOrderq collections.deque([root])while q:level list()size len(q)for _ in range(size):node q.popl…...
服务网格实战:Istio与Linkerd对比选型与落地实践
服务网格实战:Istio与Linkerd对比选型与落地实践 大家好,我是迪哥。服务网格(Service Mesh)是微服务架构的基础设施层,负责服务间的通信、安全、监控和治理。从 Istio 到 Linkerd,我们对比了多种方案&#…...
工业智能网关:三菱FX3U PLC数据采集
调试准备: 需要准备的材料:HINET 智能网关、现场安装三菱 FX3U、网线等;网关和 PLC 的连接方式:网关 LAN 口直接和 PLC 网线连接; PLC 和网关的 IP 地址以及现场联网条件说明: 三菱 FX3U 的 IP:…...
iOS自动化测试环境搭建:Xcode签名与WebDriverAgent配置全指南
1. 为什么iOS自动化测试环境比Android更让人头疼——从Xcode签名到WebDriverAgent的硬门槛AppiumPython实现iOS自动化测试~环境搭建,这短短十几个字背后,藏着绝大多数刚接触iOS自动化的新手在前三天反复重装系统、重启Mac、怀疑人生的真实写照。我带过六…...
jquery.inputmask插件介绍
目录 一、什么是 jQuery.inputmask? 主要应用场景 二、快速上手 1. 引入依赖文件 2. 基础用法 3. 掩码字符定义 三、高级功能 1. 自定义占位符 2. 完成回调 3. 扩展自定义字符 4. 重复掩码 5. 移除默认占位符 四、配合 Vue.js 使用 五、更多实用示例 …...
Tomcat Windows路径导致HTTP响应头信息泄露漏洞解析
1. 这个漏洞不是“能读文件”那么简单,而是Tomcat在特定配置下主动把敏感信息塞进HTTP响应头里CVE-2024-21733这个编号刚出来时,我第一反应是又一个常规的路径遍历或文件读取漏洞。但实际复现后才发现,它根本不是靠构造恶意URL去“偷”东西&a…...
写给前端的 CAAN-pyasc:昇腾Python Ascend C绑定到底是啥?
写给前端的 CAAN-pyasc:昇腾Python Ascend C绑定到底是啥? 之前有兄弟问我:“哥,我想在 Python 里直接写 Ascend C 算子,不想写 C,咋搞?” 好问题。今天一次说清楚。 pyasc 是啥? py…...
告别操作割裂感:保存你的专属Blender配置文件(含Unity键位预设)
告别操作割裂感:保存你的专属Blender配置文件(含Unity键位预设) 在三维创作流程中,Blender与Unity的组合堪称黄金搭档。但当你在两个软件间频繁切换时,截然不同的操作方式就像开车时突然换挡——明明想左转却按了雨刷器…...
3步搞定歌词管理难题:LDDC歌词下载工具的完整实战指南
3步搞定歌词管理难题:LDDC歌词下载工具的完整实战指南 【免费下载链接】LDDC 简单易用的精准歌词(逐字歌词/卡拉OK歌词)下载匹配工具|A simple and user-friendly tool for downloading and matching precise lyrics (word-by-word lyrics/Karaoke lyrics) 项目地…...
集成网口设计全攻略:带磁性RJ45的选型、PoE适配与EMC布局实战
📌 摘要: 集成网口(带网络变压器的RJ45连接器)将隔离变压器、共模扼流圈和RJ45插座合为一体,极大简化了以太网物理层设计。但不同PHY驱动类型、PoE功率等级、EMC性能要求以及工业环境振动等因素,都直接影响…...
终极GTA5安全增强菜单:YimMenu完整使用指南
终极GTA5安全增强菜单:YimMenu完整使用指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu Y…...
