当前位置: 首页 > news >正文

SpringBoot--自动配置原理详解

为什么要学习自动配置原理?

原因:在实际开发中,我们经常会定义一些公共的组件,提供各个团队来使用,为了使用方便,我们经常会将公共的组件自定义成starter,如果想自定义starter,必须来了解自动配置原理。

遵循约定大于配置的原则,在springboot程序启动后,起步依赖中的一些bean对象会自动注入到IOC容器中。

这时就需要去springboot中的源码中解析了。

源码分析:

程序中引入spring-boot-starter-web起步依赖后,启动就会自动往IOC容器中注入DispatcherServlet。

代码展示:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
 @SpringBootApplicationpublic class SpringbootAutoConfigApplication {​public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootAutoConfigApplication.class, args);System.out.println(context.getBean(DispatcherServlet.class));}}

分析源码

启动类@SpringBootApplication是一个组合注解,其中组合了三个注解。

image-20250514212232454

第一个注解@springBootConfiguration

作用是声明启动类也是一个配置类:源码如下

 @Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Configuration@Indexedpublic @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;}
第二个注解(重点):@EnableAutoConfiguration

这是自动配置的核心注解。源码如下:

image-20250514212801491

之前在学习Bean注册时,@Import的第二种用法:@EnableXxxx注解,用于封装@Import注解(导入ImportSelector 接口实现类)。

再看源码。这不就是我们在学习Bean注册使用的方法吗,在进入AutoConfigurationImportSelector类中一探究竟!

public class AutoConfigurationImportSelector implements DeferredImportSelector
public interface DeferredImportSelector extends ImportSelector

这说明AutoConfigurationImportSelector就是ImportSelect接口的实现类。

既然是ImportSelect接口的实现类,那一定重写了selectImports方法。那我们之前在学习注册Bean时,曾说过,selectImports方法会被springboot自动调用从而得到返回的全类名的字符串数组,然后将对应的Bean对象注入到IOC容器中。

但是在源码中springboot并不会调用selectImports方法.

因为此时AutoConfigurationImportSelector实现的是ImportSelector的子类 DeferredImportSelector。而springboot针对于DeferredImportSelector接口的实现类有另外一组处理流程,在这个流程中并不会调用这个selectImports方法。

但是我们还是可以通过解析selectImports方法学习自动配置的原理。

继续回忆:当时在学习注册Bean时,selectImports方法是通过返回一个全类名的数组,从而将Bean对象注入IOC容器中,这些全类名也是从配置文件中读取出来再输入数组中。

再看源码,springboot这里也是需要去读取配置文件中的全类名再返回,而在源码中是调用getAutoConfigurationEntry(annotationMetadata)新建autoConfigurationEntry对象调用getConfigurations()方法,可以缩减成

return StringUtils.toStringArray(getAutoConfigurationEntry(annotationMetadata).getConfigurations());

因此重点就是getAutoConfigurationEntry()方法,这里面应该可以得知配置文件的位置。

image-20250514214550651

继续跟进,去看getAutoConfigurationEntry()方法的源码,可以看到返回了一个AutoConfigurationEntry对象,里面有两个参数,其中configurations应该和我们的配置文件有关,

继续跟进,发现通过调用getCandidateConfigurations方法生成字符串数组。

image-20250514215517843

继续跟进,去查看getCandidateConfigurations方法源码:

至此,我们终于找到了配置文件的所在地,同时也绕不开一个类:autoConfigurationAnnotation类,这个类决定了配置文件,所以需要继续跟进。

image-20250514222459371

同时我们在解析springboot中的starter的起步依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>

在跟进解析

image-20250514223156768

我们在去导入的依赖库中寻找

image-20250514223710667

进入到这些imports文件中,里面果然是一堆类的全类名。而且都是自动配置类。

image-20250514224251069

我们也可以去看看这些自动配置类如何书写的,我们可以去找DispatcherServletAutoConfiguration

找到之后,发现DispatcherServletAutoConfiguration类上声明了一个@AutoConfiguration注解,(自动配置)

image-20250514224955426

我们去看下@AutoConfiguration注解的源码

image-20250514225614006

同时我们在DispatcherServletAutoConfiguration类上也发现了一个老熟人,在我们学习注册条件时,学到的Conditional注解的衍生注解@ConditionalOnClass: 当前环境存在指定的类时,该注解声明下的Bean才会被注册。

在这里的意思就是@ConditionalOnClass(DispatcherServlet.class):如果说运行环境中有DispatcherServlet类,这是DispatcherServletAutoConfiguration类(DispatcherServlet自动配置类)就生效!就可以自动注入一个DispatcherServlet Bean对象。

继续分析源码:

我们在DispatcherServletAutoConfiguration中还发现了一个内部配置类DispatcherServletConfiguration。

而且这个内部配置类里面的方法就是我们学习Bean注册时所用的注入方法,用@Bean注解声明,返回DispatcherServlet对象。

而且这里面最核心的地方在于,

将DispatcherServletAutoConfiguration写进指定的配置文件中

这时,springboot就可以自动的到配置文件中读取,将自动配置类的对象注入到IOC容器中。

又由于自动配置类的内部还有一个配置类,且内部配置类中还有用@Bean声明的方法,

因此,springboot还是会继续解析,直至解析完毕,将所有的Bean对象注入到IOC容器中。

image-20250514231219136

总结:自动配置的核心就是"META-INF/spring/"+ this.autoConfigurationAnnotation.getName() + ".imports配置文件

在springboot2.7版本之前,自动配置使用的这个配置文件是spring.factories,springboot会从这个配置文件中读取自动配置类的全类名。

在springboot2.7到3.0之间,springboot同时兼容了.imports文件以及spring.factories,但是在3.0以后就只支持.imports文件了。

至此。自动配置的原理已经明了。

再回到最开始,我们在学习Bean注册时的代码是自动配置吗?

明显没有,因为我们还需要去手动的提供配置类,还需要去写Imports注解。

如果要达到自动配置的效果,配置类不应该是自己提供。

应该是谁提供Bean对象,谁就应该提供这些配置类,因此配置类应该由jar包提供。

接下来我们还要jar包提供一个自动配置类,并且在自动配置类上声明两个注解:@AutoConfiguration(声明自动配置类),还有@Import()(导入配置类。

最后我们需要提供一个.imports配置文件,将自动配置类的全类名放在.imports配置文件中。这样我们就达到了自动配置的效果.

案例展示

自定义maven项目,结合Bean注册以及注册条件中的知识创建自动配置项目并打包成jar包common-pojo-2.0

首先新建Maven项目,新建src目录及resources目录,在如下建立包

image-20250517152559691

代码如下:

pom.xml:

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.4.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.38</version></dependency></dependencies>

pojo包下

Country

 @Data@AllArgsConstructor@NoArgsConstructorpublic class Country {private String name;private String code;}

Province

 @Data@AllArgsConstructor@NoArgsConstructorpublic class Province {private String  name;private String direction;}

config包下

commonConfig

 public class CommonConfig {@ConditionalOnProperty(prefix = "country",value = {"name","code"})@Bean//注入country对象public Country country(@Value("${country.name}") String name, @Value("${country.code}") String code){return new Country(name, code);}//    @Bean("aa")//如果方法内部需要使用IOC容器中的bean,则需要传入参数,springboot会自动传入//如果方法内部没有使用IOC容器中的bean,则不需要传入参数@Beanpublic Province province(){return new Province();}}

commonAutoConfig

@AutoConfiguration@Import({CommonConfig.class})public class CommonAutoConfig {public CommonAutoConfig() {}}

META-INF包下 org.springframework.boot.autoconfigure.AutoConfiguration.imports

 com.lyc.config.CommonAutoConfig

代码如上所示:

最终使用maven工具打包,从target包下拿到jar包

image-20250517153325328

将jar包与该项目放于同一文件夹下。

在命令行中输入以下指令

 mvn install:install-file  -Dfile="E:\桌面\测试\common-pojo-2.0-1.0-SNAPSHOT.jar" -DgroupId=com.lyc -DartifactId=common-pojo-2.0 -Dversion=1.0-SNAPSHOT -Dpackaging=jar

最终在pom文件中输入依赖

 <dependency><groupId>com.lyc</groupId><artifactId>common-pojo-2.0</artifactId><version>1.0-SNAPSHOT</version></dependency>

最终得到:

image-20250517153648192

进行测试,看Province Bean对象是否注入IOC容器中

在配置文件中给属性赋值

 country:name: 中国code: CN
 public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootAutoConfigApplication.class, args);System.out.println(context.getBean(DispatcherServlet.class));System.out.println(context.getBean("province"));System.out.println(context.getBean("country"));}

结果:

image-20250517153955267

测试成功

面试高频:说一说springBoot自动配置原理?

首先在主启动类上添加了@SpringBootApplication注解,这是一个组合注解,其中包含了@EnableAutoConfiguration注解。这个注解就是开启自动配置的关键注解。

在@EnableAutoConfiguration注解中,又组合了@Import注解,导入了AutoConfigurationImportSelector类,这类实现了selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件。

在springboot2.7版本以前,读取的是spring.factories文件,在2.7到3.0之间兼容,3.0版本之后只允许读取imports文件。

这个imports文件中包含了许多自动配置类的全类名,springboot底层会自动读取imports文件中的全类名。

解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的Bean对象自动注入到IOC容器中。

希望对大家有所帮助!

相关文章:

SpringBoot--自动配置原理详解

为什么要学习自动配置原理&#xff1f; 原因&#xff1a;在实际开发中&#xff0c;我们经常会定义一些公共的组件&#xff0c;提供各个团队来使用&#xff0c;为了使用方便&#xff0c;我们经常会将公共的组件自定义成starter&#xff0c;如果想自定义starter&#xff0c;必须…...

MiInsertPageInFreeList函数分析和MmFreePagesByColor数组的关系

第一部分&#xff1a; Color MI_GET_COLOR_FROM_LIST_ENTRY(PageFrameIndex, Pfn1); ColorHead &MmFreePagesByColor[ListName][Color]; 第二部分&#xff1a; #define MI_GET_COLOR_FROM_LIST_ENTRY(index,pfn) \ ((ULONG)(((pfn)->…...

Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置

文章目录 前言1. 安装 HBuilder X2. WebStorm/IDEA 安装 Uniapp Tool 插件3. 配置 Uniapp Tool 插件4. 运行 Uni-App 项目 前言 前端开发人员对 WebStorm 一定不陌生&#xff0c;但有时需要开发 Uni-App 的需求&#xff0c;就必须要采用 HBuilder X&#xff0c;如果不习惯 HBu…...

redisson分布式锁实现原理归纳总结

Redisson 分布式锁的实现原理主要依赖于 Redis 的 Hash 数据结构、Lua 脚本、发布订阅机制以及看门狗&#xff08;Watchdog&#xff09;机制&#xff0c;以下是核心要点总结&#xff1a; 1. 核心原理 • 互斥性与可重入性&#xff1a; 通过 Redis 的 Hash 数据结构保存锁的持…...

Ubuntu 添加系统调用

实验内容 通过内核编译法添加一个不用传递参数的系统调用&#xff0c;其功能可自定义。 &#xff08;1&#xff09;添加系统调用号&#xff0c;系统会根据这个号找到syscall_table中的相应表项。具体做法是在syscall_64.tbl文件中添加系统调用号和调用函数的对应关系。 &#…...

Olib 2.2.0 | 免费开源软件,无需注册登录即可从ZLibrary下载多语言电子书

Olib是一款专为书籍爱好者设计的免费开源软件&#xff0c;它允许用户无需注册或登录即可从ZLibrary高速下载各种语言的电子书。该软件支持上百种语言的电子书下载&#xff0c;非常适合需要多语言资源的读者和研究人员使用。Olib的操作界面非常直观&#xff0c;使得书籍的搜索与…...

c++动态链接库

1. 生成动态链接库 首先实现一个动态链接库的代码 // example.cpp #include <iostream> void sayHello() {std::cout << "Hello from shared library!" << std::endl; }int add(int a, int b) {return a b; }// example.h #pragma once void sa…...

HelloWorld

HelloWorld 新建一个java文件 文件后缀名为 .javahello.java【注意】系统可能没有显示文件后缀名&#xff0c;我们需要手动打开 编写代码 public class hello {public static void main(String[] args) {System.out.print(Hello,World)} }编译 javac java文件&#xff0c;会生…...

SVGPlay:一次 CodeBuddy 主动构建的动画工具之旅

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 背景与想法 我一直对 SVG 图标的动画处理有浓厚兴趣&#xff0c;特别是描边、渐变、交互等效果能为图标增添许…...

SLAM定位常用地图对比示例

序号 地图类型 概述 1 格栅地图 将现实环境栅格化,每一个栅格用 0 和 1 分别表示空闲和占据状态,初始化为未知状态 0.5 2 特征地图 以点、线、面等几何特征来描绘周围环境,将采集的信息进行筛选和提取得到关键几何特征 3 拓扑地图 将重要部分抽象为地图,使用简单的图形表示…...

强化学习中,frames(帧)和 episodes(回合)

在强化学习中&#xff0c;frames&#xff08;帧&#xff09;和 episodes&#xff08;回合&#xff09;是两个不同的概念&#xff1a; 1. 定义差异 Frame&#xff08;帧&#xff09;&#xff1a; 表示智能体与环境交互的单个时间步&#xff08;step&#xff09;&#xff0c;例如…...

HCIP第六次作业

一、拓扑图 二、需求 1、使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2…...

高频面试题(含笔试高频算法整理)基本总结回顾110

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

数据湖与数据仓库融合:Hudi、Iceberg、Delta Lake 实践对比

在实时与离线一体化的今天,数据湖与数据仓库边界不断融合,越来越多企业选用如 Hudi、Iceberg、Delta Lake 等开源方案实现统一的数据存储、计算、分析平台。本篇将围绕以下关键点,展开实战对比与解决方案分享: ✅ 实时写入能力 ✅ ACID 保证 ✅ 增量数据处理能力 ✅ 流批一…...

OGG 更新表频繁导致进程中断,见鬼了?非也!

大家好&#xff0c;这里是 DBA学习之路&#xff0c;专注于提升数据库运维效率。 目录 前言问题描述问题分析解决方案后续 前言 最近几周一直遇到一个 OGG 问题&#xff0c;有一张表已更新就会中断 OGG 同步进程&#xff0c;本文记录一下分析过程以及解决方案。 问题描述 昨天…...

C++学习-入门到精通-【7】类的深入剖析

C学习-入门到精通-【7】类的深入剖析 类的深入剖析 C学习-入门到精通-【7】类的深入剖析一、Time类的实例研究二、组成和继承三、类的作用域和类成员的访问类作用域和块作用域圆点成员选择运算符(.)和箭头成员选择运算符(->)访问函数和工具函数 四、具有默认实参的构造函数重…...

非易失性存储技术综合对比:EEPROM、NVRAM、NOR Flash、NAND Flash和SD卡

非易失性存储技术综合对比&#xff1a;EEPROM、NVRAM、NOR Flash、NAND Flash和SD卡 读写性能对比 存储类型读取速度写入速度随机访问能力最小操作单位NVRAM极快(~10ns)极快(~10ns)极优(字节级)字节EEPROM中等(~100ns)慢(~5ms/字节)优(字节级)字节NOR Flash快(~50ns)慢(~5ms/…...

数字化转型- 数字化转型路线和推进

数字化转型三个阶段 百度百科给出的企业的数字化转型包括信息化、数字化、数智化三个阶段 信息化是将企业在生产经营过程中产生的业务信息进行记录、储存和管理&#xff0c;通过电子终端呈现&#xff0c;便于信息的传播与沟通。数字化通过打通各个系统的互联互通&#xff0c;…...

ARM (Attention Refinement Module)

ARM模块【来源于BiSeNet】&#xff1a;细化特征图的注意力&#xff0c;增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块&#xff0c;它通过注意力机制来细化特征图&…...

符合Python风格的对象(对象表示形式)

对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方 式。Python 提供了两种方式。 repr()   以便于开发者理解的方式返回对象的字符串表示形式。str()   以便于用户理解的方式返回对象的字符串表示形式。 正如你所知&#xff0c;我们要实现_…...

AtCoder AT_abc406_c [ABC406C] ~

前言 除了 A 题&#xff0c;唯一一道一遍过的题。 题目大意 我们定义满足以下所有条件的一个长度为 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1​,A2​,…,AN​) 为波浪序列&#xff1a; N ≥ 4 N\ge4 N≥4&#xff08;其实满足后面就必须满足这…...

多指标组合策略

该策略(MultiConditionStrategy)是一种基于多种技术指标和市场条件的交易策略。它通过综合考虑多个条件来生成交易信号,从而决定买入或卖出的时机。 以下是对该策略的详细分析: 交易逻辑思路 1. 条件1:星期几和价格变化判断 - 该条件根据当前日期是星期几以及价格的变化…...

系统架构-大数据架构设计

基础介绍 三大挑战&#xff1a; 如何处理非结构化和半结构化数据如何探索大数据复杂性、不确定性特征描述的刻画方法及大数据的系统建模数据异构性与决策异构性的关系对大数据知识发现与管理决策的影响 架构特征&#xff1a; 鲁棒性&#xff08;稳定性&#xff09;和容错性…...

R语言空间数据处理入门教程

我的课程《R语言空间数据处理入门教程》已重新恢复课程售卖&#xff0c;有需要的读者可以学习。 &#x1f447;点击下方链接&#xff08;文末“阅读原文”可直达&#xff09;&#xff0c;立即开启你的空间数据之旅&#xff1a; https://www.bilibili.com/cheese/play/ss13775…...

QT+EtherCAT 主站协议库—SOEM主站

SOEM 是 Simple Open EtherCAT Master Library 的缩写&#xff0c;是瑞典 rt-lab 提供 的一个开源 EtherCAT 主站协议库 。 SOEM 库使用 C 语言编写&#xff0c;可以在 windows 以及 Linux 平台上运行&#xff0c;并也可以方便地移植到嵌入式平台上。 SOEM 支持 CoE &#xff0…...

Java-反射(Reflection)

一&#xff1a;概述 &#xff08;1&#xff09;出现背景 &#xff08;2&#xff09;解决方案 &#xff08;3&#xff09;使用场景 业务开发用的少&#xff0c;框架使用的多&#xff0c;业务反射被认为是动态语言的关键 &#xff08;4&#xff09;与原方法对比 &#xff08;5…...

第一次经历项目上线

这几天没写csdn&#xff0c;因为忙着项目上线的问题&#xff0c;我这阶段改了非常多的前端bug哈哈哈哈&#xff0c;说几个比较好的bug思想&#xff01; 这个页面算是我遇到的比较大的bug&#xff0c;因为我一开始的逻辑都写好了&#xff0c;询价就是在点击快递公司弹出弹框的时…...

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析

MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输&#xff0c;在物联网领域应用的很广泛&#xff0c;它是基于Publish/Subscribe模式&#xff0c;具有简单易用&#xff0c;支持QoS&#xff0c;传输效率高的特点。 它被设计用于低带宽&#xff0c;不稳定或高延迟的…...

DeepSeek超大模型的高效训练策略

算力挑战 训练DeepSeek此类千亿乃至万亿级别参数模型,对算力资源提出了极高要求。以DeepSeek-V3为例,其基础模型参数量为67亿,采用专家混合(MoE)架构后实际激活参数可达几百亿。如此规模的模型远超单张GPU显存容量极限,必须借助分布式并行才能加载和训练。具体挑战主要包…...

【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理

转眼做人脸复原(face restoration)算法也一段时间了&#xff0c;根据自己的记忆整理一下自己的一些看法&#xff0c;算作个人记录&#xff0c;当然如果有人愿意分享自己的看法也是极好的。先挂下文章链接&#xff0c;下一篇在写总结。 一、前述 人脸修复(face restoration)任…...

最小二乘法拟合平面(线性回归法、梯度下降、PCA法)

参考笔记&#xff1a; Open3D 最小二乘拟合平面&#xff08;直接求解法&#xff09;【2025最新版】_python open3d已知平面方程绘制平面-CSDN博客 目录 1.前言 2.线性回归法 2.1 模型假设 2.2 定义误差函数 2.3 求偏导并解方程 2.4 解方程 2.5 案例演示 2.5.1 手工计…...

数组名既可作为指针也可作为变量名

在C语言中&#xff0c;数组名在不同的上下文中既可以作为指向数组首个元素的指针&#xff0c;也可以代表整个数组&#xff0c;这是由C语言的设计和语法规则决定的&#xff0c;下面我来详细解释一下。 1. 数组名作为指向首元素的指针 在大多数情况下&#xff0c;当数组名出现在…...

MySQL相关

1.多表查询关键点在哪 &#x1f4d6; 1️⃣ 明确关联关系 先搞清楚多表之间的关联关系&#xff1a; 一对一&#xff08;1:1&#xff09; 一对多&#xff08;1:N&#xff09; 多对多&#xff08;M:N&#xff09; 比如&#xff1a; 一个课程对应一个教室&#xff08;1:1&am…...

Axure制作可视化大屏动态滚动列表教程

在可视化大屏设计中&#xff0c;动态滚动列表是一种常见且实用的展示方式&#xff0c;能够有效地展示大量信息。本文将详细介绍如何使用Axure制作一个动态滚动的列表展示模块。 一、准备工作 打开Axure软件&#xff1a;确保你已经安装并打开了Axure RP软件。创建新项目&#x…...

计算机网络(1)——概述

1.计算机网络基本概念 1.1 什么是计算机网络 计算机网络的产生背景 在计算机网络出现之前&#xff0c;计算机之间都是相互独立的&#xff0c;每台计算机只能访问自身存储的数据&#xff0c;无法与其他计算机进行数据交换和资源共享。这种独立的计算机系统存在诸多局限性&#…...

融智学视域下的系统性认知增强框架——基于文理工三类AI助理赋能HI四阶跃迁路径

融智学视域下的系统性认知增强框架 ——基于文理工三类AI助理赋能HI四阶跃迁路径 一、如何排除50个认知偏差&#xff1a;消除50类偏差的精准矫正系统 1. 技术架构 文科AI&#xff1a; 构建文化语义场&#xff08;Cultural Semantic Field, CSF&#xff09;&#xff0c;通过…...

C++ - 仿 RabbitMQ 实现消息队列(2)(Protobuf 和 Muduo 初识)

C - 仿 RabbitMQ 实现消息队列&#xff08;2&#xff09;&#xff08;Protobuf 和 Muduo 初识&#xff09; Protobuf1. 序列化/反序列化方法&#xff08;最核心&#xff09;_InternalSerialize()_InternalParse() 2. 内存管理方法SharedCtor()/SharedDtor()InternalSwap() 3. 字…...

FTP与NFS服务实战:从配置到应用

一、FTP服务进阶&#xff1a;客户端工具与访问控制 1. FTP客户端工具对比 在Linux中&#xff0c;ftp和lftp是常用的FTP客户端工具&#xff0c;功能各有侧重&#xff1a; 工具特点适用场景ftp基础命令交互&#xff0c;需手动输入用户名/密码简单文件传输lftp支持多协议、批量…...

高考AI试题查询系统

高考AI试题查询系统 gitee&#xff1a;https://gitee.com/ltyyyds26/GaoKao_AI 数据 来源&#xff1a;OpenLMLab/GAOKAO-Bench: GAOKAO-Bench is an evaluation framework that utilizes GAOKAO questions as a dataset to evaluate large language models. (github.com) 数…...

记录算法笔记(2025.5.17)验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入&…...

DataX:一个开源的离线数据同步工具

DataX 是一个异构数据源离线同步&#xff08;ETL&#xff09;工具&#xff0c;实现了包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。它也是阿里云 DataWorks 数据集成功能的开源版本。 为了解决异构数据源同…...

剑指offer第一周

目录 二维数组中的查找 旋转数组的最小数字 调整数组顺序使奇数位于偶数前面 数组中出现次数超过一半的数字 替换空格 从尾到头打印链表 重建二叉树 矩形覆盖 链表中倒数最后k个结点 二进制中1的个数 合并两个排序的链表 树的子结构 二叉树的镜像 ​​​​​​​二…...

素数筛(欧拉筛算法)

#include<bits/stdc.h> using namespace std; #define maxn 100000 int vis[maxn]; int prime[maxn]; //欧拉筛函数 int Euler_sieve(int n) { int i,j,k; k0;//保存素数的个数 memset(vis,0,sizeof(int)*maxn);//初始化数组 for(i2;i<n;i) { if(vis[i]0)//i是素数…...

遨游科普:三防平板是什么?有什么功能?

清晨的露珠还挂在帐篷边缘&#xff0c;背包里的三防平板却已开机导航&#xff1b;工地的尘土飞扬中&#xff0c;工程师正通过它查看施工图纸&#xff1b;暴雨倾盆的救援现场&#xff0c;应急队员用它实时回传灾情数据……这些看似科幻的场景&#xff0c;正因三防平板的普及成为…...

CSS 浮动与定位以及定位中z-index的堆叠问题

CSS 浮动与定位以及定位中z-index的堆叠问题 一、浮动布局的特点与应用 1. 浮动核心特性 脱离标准流&#xff1a;浮动元素会脱离文档流。环绕特性&#xff1a;后续内容会环绕浮动元素排列自动换行&#xff1a;多个浮动元素在容器宽度不足时自动换行 .float-box {float: lef…...

在Maven中替换文件内容的插件和方法

在Maven中替换文件内容的插件和方法 Maven提供了几种方式来替换文件内容&#xff0c;以下是常用的插件和方法&#xff1a; 1. maven-replacer-plugin (推荐) 这是专门用于文件内容替换的插件&#xff0c;功能强大且灵活。 基本配置 <plugin><groupId>com.goog…...

C# lock

在C#中&#xff0c;lock关键字用于确保当一个线程位于给定实例的代码块中时&#xff0c;其他线程无法访问同一实例的该代码块。这是一种简单的同步机制&#xff0c;用来防止多个线程同时访问共享资源或执行需要独占访问的代码段&#xff08;临界区&#xff09;&#xff0c;从而…...

OGGMA 21c 微服务 (MySQL) 安装避坑指南

前言 这两天在写 100 天实战课程 的 OGG 微服务课程&#xff1a; 在 Oracle Linux 8.10 上安装 OGGMA 21c MySQL 遇到了一点问题&#xff0c;分享给大家一起避坑&#xff01; 环境信息 环境信息&#xff1a; 主机版本主机名实例名MySQL 版本IP 地址数据库字符集Goldengate …...

NPN、PNP三极管的应用

由于电路知识实在是难以拿出手&#xff0c;在面试的时候被问到三极管相关问题&#xff0c;相当地尴尬。在网上简要地学习了相关的理论知识&#xff0c;在这里给出自己的理解。更为基础的原理在这里并不提及。我们面向实际应用学习即可。 我们知道常见的三极管总是硅管&#xff…...

Cadence Allegro安装教程及指导

Cadence Allegro 是一款专业的 PCB 设计软件&#xff0c;被广泛应用于电子行业。它功能强大&#xff0c;能够处理复杂的电路板设计任务。下面为你详细介绍 Cadence Allegro 的安装步骤。 一、安装前准备 在安装 Cadence Allegro 之前&#xff0c;需要进行一系列准备工作&…...