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

Post-Processing PropertySource instance详解 和 BeanFactoryPostProcessor详解

PropertySourcesBeanFactoryPostProcessor详解

在这里插入图片描述


1. 核心概念

BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化阶段Environment 中的 PropertySource 进行后处理的接口。它允许开发者在 Bean 创建之前 对属性源进行动态修改,例如添加、删除或转换属性。


2. 核心流程与类关系
2.1 核心接口与实现
  • 接口定义

    public interface PropertySourcesBeanFactoryPostProcessor {void postProcessPropertySources(ConfigurableListableBeanFactory beanFactory, MutablePropertySources propertySources);
    }
    
    • 参数
      • ConfigurableListableBeanFactory:Spring 的 BeanFactory 实例。
      • MutablePropertySources:可修改的属性源集合(包含所有已加载的 PropertySource)。
  • 作用
    在 BeanFactory 初始化过程中,提供对 PropertySource 的直接修改能力,例如:

    • 动态添加自定义属性源(如从数据库读取配置)。
    • 过滤敏感属性(如密码)。
    • 调整属性源的优先级。

3. 典型使用场景
3.1 动态添加 PropertySource
// 示例:从数据库加载配置并添加到 PropertySources
public class DatabasePropertySourcePostProcessor implements PropertySourcesBeanFactoryPostProcessor {@Overridepublic void postProcessPropertySources(ConfigurableListableBeanFactory beanFactory, MutablePropertySources propertySources) {// 1. 从数据库获取配置Map<String, Object> dbProps = loadConfigFromDatabase();// 2. 创建自定义 PropertySourcePropertySource<?> dbPropertySource = new MapPropertySource("databaseConfig", dbProps);// 3. 将其添加到最高优先级(覆盖现有配置)propertySources.addFirst(dbPropertySource);}
}
3.2 过滤敏感属性
public class SensitivePropertyFilter implements PropertySourcesBeanFactoryPostProcessor {@Overridepublic void postProcessPropertySources(ConfigurableListableBeanFactory beanFactory, MutablePropertySources propertySources) {// 遍历所有 PropertySource 并过滤敏感键List<PropertySource<?>> filteredSources = new ArrayList<>();for (PropertySource<?> source : propertySources) {if (source instanceof EnumerablePropertySource) {Map<String, Object> filteredProps = new HashMap<>();for (String key : ((EnumerablePropertySource<?>) source).getPropertyNames()) {if (!key.contains("password")) {filteredProps.put(key, source.getProperty(key));}}PropertySource<?> filteredSource = new MapPropertySource(source.getName(), filteredProps);filteredSources.add(filteredSource);}}// 替换原有的 PropertySourcespropertySources.clear();propertySources.addAll(filteredSources);}
}
3.3 调整属性源优先级
public class CustomPropertyOrderPostProcessor implements PropertySourcesBeanFactoryPostProcessor {@Overridepublic void postProcessPropertySources(ConfigurableListableBeanFactory beanFactory, MutablePropertySources propertySources) {// 将某个 PropertySource 移动到最高优先级PropertySource<?> sourceToMove = propertySources.get("customConfig");if (sourceToMove != null) {propertySources.remove("customConfig");propertySources.addFirst(sourceToMove);}}
}

4. 实现步骤
4.1 定义处理器
public class CustomPropertyProcessor implements PropertySourcesBeanFactoryPostProcessor {@Overridepublic void postProcessPropertySources(ConfigurableListableBeanFactory beanFactory, MutablePropertySources propertySources) {// 在此处实现属性源的修改逻辑}
}
4.2 注册处理器

通过 @Bean 注册到 Spring 容器:

@Configuration
public class AppConfig {@Beanpublic PropertySourcesBeanFactoryPostProcessor customProcessor() {return new CustomPropertyProcessor();}
}
4.3 集成到 Spring Boot

在 Spring Boot 中,可以通过 EnvironmentPostProcessor 在启动时注入:

public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 在此处注册 PropertySourcesBeanFactoryPostProcessor}
}

5. 关键流程与方法
5.1 属性源处理流程
Spring Boot 启动 →加载所有 PropertySource(如 application.properties、环境变量等) →调用 PropertySourcesBeanFactoryPostProcessor.postProcessPropertySources() →修改后的 PropertySources 用于后续 Bean 的属性注入。
5.2 核心方法详解
方法说明
postProcessPropertySources()核心方法,接收 BeanFactoryMutablePropertySources,进行属性源修改。
propertySources.addFirst(source)将属性源添加到最高优先级(覆盖现有配置)。
propertySources.remove(name)移除指定名称的属性源。
propertySources.get(name)根据名称获取属性源。

6. 典型应用场景总结
场景解决方案示例代码片段
动态配置注入从数据库/远程服务加载配置并添加为 PropertySource。propertySources.addFirst(new MapPropertySource("dbConfig", dbProps));
敏感信息过滤移除或修改包含敏感信息的属性键(如密码)。if (!key.contains("password")) { ... }
优先级调整将自定义配置的优先级设为最高,覆盖默认配置。propertySources.addFirst(existingSource);
属性值转换将字符串属性转换为复杂类型(如 ListMap)。Map<String, Object> convertedProps = ...

7. 注意事项
  1. 执行时机:在 BeanFactory 初始化阶段执行,早于 @PostConstruct 和 Bean 初始化。
  2. 优先级控制:通过 addFirst()addLast()insertBefore()/insertAfter() 精确控制属性源顺序。
  3. 副作用风险:避免在处理器中执行耗时操作,可能影响应用启动速度。
  4. Spring Boot 集成:需确保处理器在 Environment 初始化后被正确调用。

8. 总结表格
功能实现方式适用场景
动态配置注入通过 addFirst() 添加自定义 PropertySource。需要从外部源(如数据库)加载配置时。
属性过滤遍历 PropertySources 并移除敏感键。隐藏敏感配置(如数据库密码、API密钥)。
优先级调整使用 addFirst()remove() 调整属性源顺序。需要高优先级配置覆盖默认值(如测试环境覆盖生产配置)。
属性值转换在处理器中修改属性值类型(如字符串转 List)。需要动态解析复杂类型配置时。

通过 PropertySourcesBeanFactoryPostProcessor,可以灵活控制属性源的加载和修改逻辑,满足复杂配置需求。

延伸阅读

Post-Processing PropertySource instance详解


1. 核心概念

PropertySource 是 Spring 框架中用于管理配置属性的抽象类,负责从不同来源(如 application.properties、环境变量、系统属性等)加载属性值。
Post-Processing 是指在 PropertySource 被创建或注册到 Environment 后,对其内容进行进一步的处理或修改。


2. 核心流程与类关系
2.1 核心类与接口
类/接口作用
PropertySource属性源的抽象基类,封装属性键值对(如 server.port=8080)。
EnvironmentSpring 的环境对象,管理所有 PropertySource 的优先级和合并逻辑。
PropertySources存储 PropertySource 集合的容器,按优先级排序。
PropertySourceProcessorPropertySource 进行后处理的接口(如过滤、转换属性)。
PropertySourcesPropertyResolver根据优先级从多个 PropertySource 中解析属性值的工具类。
2.2 核心流程
  1. 属性源加载:Spring Boot 启动时,从 application.properties、YAML 文件、环境变量等加载属性,生成多个 PropertySource 实例。
  2. 属性源注册:将所有 PropertySource 注册到 EnvironmentPropertySources 容器中。
  3. 后处理阶段:对已注册的 PropertySource 进行统一处理(如过滤敏感属性、替换占位符、合并配置等)。

3. 典型 Post-Processing 场景
3.1 属性过滤
  • 场景:隐藏敏感属性(如密码、API密钥)。
  • 实现方式
    // 自定义 PropertySourceProcessor
    public class SensitivePropertyFilter implements PropertySourceProcessor {@Overridepublic PropertySource<?> processPropertySource(PropertySource<?> source) {if (source.getName().equals("someConfig")) {Map<String, Object> filteredProps = new HashMap<>();((MapPropertySource) source).forEach((key, value) -> {if (!key.contains("password")) {filteredProps.put(key, value);}});return new MapPropertySource(source.getName(), filteredProps);}return source;}
    }
    
3.2 属性值转换
  • 场景:将字符串属性转换为其他类型(如 ListMap)。
  • 实现方式
    public class TypeConverterProcessor implements PropertySourceProcessor {@Overridepublic PropertySource<?> processPropertySource(PropertySource<?> source) {Map<String, Object> convertedProps = new HashMap<>();((MapPropertySource) source).forEach((key, value) -> {if (key.endsWith(".asList")) {convertedProps.put(key, Arrays.asList(value.toString().split(",")));} else {convertedProps.put(key, value);}});return new MapPropertySource(source.getName(), convertedProps);}
    }
    
3.3 属性覆盖与合并
  • 场景:根据优先级合并多个属性源(如 application.properties 覆盖默认配置)。
  • 实现方式
    // Spring 的默认合并逻辑由 PropertySourcesPropertyResolver 处理
    Environment env = ...;
    String value = env.getProperty("key"); // 自动按优先级合并
    

4. 自定义 Post-Processing 的实现步骤
4.1 实现 PropertySourceProcessor
public class CustomPropertyProcessor implements PropertySourceProcessor {@Overridepublic PropertySource<?> processPropertySource(PropertySource<?> source) {// 在此处修改或过滤 PropertySourcereturn source; // 返回修改后的 PropertySource}
}
4.2 注册处理器
@Configuration
public class PropertyConfig {@Beanpublic PropertySourceProcessor customProcessor() {return new CustomPropertyProcessor();}
}
4.3 集成到 Spring Boot

通过 EnvironmentPostProcessor 在启动时注入处理器:

public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {environment.getPropertySources().addFirst(new CustomPropertySourceProcessor().processPropertySource(...));}
}

5. 关键方法与流程
5.1 属性解析流程
Environment.getProperty(key) →PropertySourcesPropertyResolver →遍历 PropertySources(按优先级) →调用 PropertySource.getProperty(key) →返回第一个非空值
5.2 核心方法详解
方法作用
PropertySource.getProperty(key)根据键直接从当前属性源获取值。
PropertySources.getFirst(name)根据名称获取第一个匹配的属性源。
PropertySources.addFirst(source)将属性源添加到优先级最高位置(覆盖现有配置)。

6. 典型应用场景
场景解决方案
敏感属性过滤实现 PropertySourceProcessor 过滤敏感键(如 password)。
动态属性注入EnvironmentPostProcessor 中动态添加属性源(如从数据库读取配置)。
属性值类型转换使用 PropertySourceProcessor 将字符串转换为复杂类型(如 ListMap)。
多环境配置合并按优先级加载 application-{profile}.properties 并合并到 Environment。

7. 总结表格
功能实现方式适用场景
属性过滤实现 PropertySourceProcessor 过滤敏感键。隐藏敏感配置(如数据库密码)。
属性转换在处理器中修改属性值类型(如字符串转 List)。需要动态解析复杂类型配置时。
属性覆盖通过 PropertySources.addFirst() 调整属性源优先级。需要高优先级配置覆盖默认值(如测试环境覆盖生产配置)。
动态属性注入EnvironmentPostProcessor 中注册新 PropertySource。配置需从外部源(如数据库、API)动态加载时。

8. 注意事项
  1. 优先级控制:属性源的加载顺序决定了覆盖规则,需通过 PropertySources.addFirst()addLast() 明确优先级。
  2. 性能影响:复杂的后处理逻辑可能增加启动时间,需避免在高频路径中执行。
  3. Spring Boot 集成:通过 @ConfigurationEnvironmentPostProcessor 灵活扩展。

通过以上方法,可以灵活控制属性源的后处理逻辑,满足复杂配置需求。

相关文章:

Post-Processing PropertySource instance详解 和 BeanFactoryPostProcessor详解

PropertySourcesBeanFactoryPostProcessor详解 1. 核心概念 BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化阶段 对 Environment 中的 PropertySource 进行后处理的接口。它允许开发者在 Bean 创建之前 对属性源进行动态修改&#xff0c;例如添加、删除…...

go 编译的 windows 进程(exe)以管理员权限启动(UAC)

引言 windows 系统&#xff0c;在打开某些 exe 的时候&#xff0c;会弹出“用户账户控制(UAC)”的弹窗 “你要允许来自xx发布者的此应用对你的设备进行更改吗&#xff1f;” UAC&#xff08;User Account Control&#xff0c;用户账户控制&#xff09;是 Windows 操作系统中的…...

Elasticsearch性能优化实践

一、背景与挑战 基金研报搜索场景中&#xff0c;我们面临以下核心挑战&#xff1a; ​数据规模庞大&#xff1a;单索引超500GB原始数据&#xff0c;包含300万份PDF/Word研报文档​查询性能瓶颈&#xff1a;复杂查询平均响应时间超过10秒&#xff0c;高峰期CPU负载达95%​存储…...

【Web API系列】Web Shared Storage API 深度解析:WindowSharedStorage 接口实战指南

前言 在当今 Web 应用日益复杂的背景下&#xff0c;跨页面数据共享与隐私保护已成为现代浏览器技术演进的重要命题。传统 Web 存储方案&#xff08;如 Cookies、LocalStorage&#xff09;在应对多维度用户特征存储、跨上下文数据共享等场景时&#xff0c;逐渐暴露出技术瓶颈与…...

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…...

智能体MCP 实现数据可视化分析

参考: 在线体验 https://www.doubao.com/chat/ 下载安装离线体验 WPS软件上的表格分析 云上创建 阿里mcp:https://developer.aliyun.com/article/1661198 (搜索加可视化) 案例 用cline 或者cherry studio实现 mcp server:excel-mcp-server、quickchart-mcp-server...

3小时速通Python-Python学习总部署、总预览(一)

目录 Python的关键字有哪些&#xff1a; ​编辑 代码&#xff1a;1-5&#xff1a; 代码&#xff1a;6-10&#xff1a; 代码&#xff1a;11-15&#xff1a; 代码&#xff1a;16-20&#xff1a; 代码&#xff1a;21-25&#xff1a; 代码&#xff1a;26-27&#xff1a; Pyt…...

机器学习基础 - 分类模型之决策树

决策树 文章目录 决策树简介决策树三要素1. 特征的选择1. ID32. C4.53. CART2. 剪枝处理0. 剪枝的作用1. 预剪枝2. 后剪枝QA1. ID3, C4.5, CART 这三种决策树的区别2. 树形结构为何不需要归一化?3. 分类决策树与回归决策树的区别4. 为何信息增益会偏向多取值特征?4. 为何信息…...

Java面向对象的三大特性

## 1. 封装&#xff08;Encapsulation&#xff09; 封装是将数据和操作数据的方法绑定在一起&#xff0c;对外部隐藏对象的具体实现细节。通过访问修饰符来实现封装。 示例代码&#xff1a; java public class Student { // 私有属性 private String name; private int age; …...

【Pandas】pandas DataFrame truediv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

GTS-400 系列运动控制器板(六)----修改编码器计数方向

运动控制器函数库的使用 运动控制器驱动程序、 dll 文件、例程、 Demo 等相关文件请通过固高科技官网下载,网 址为: www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提…...

卷积神经网络迁移学习:原理与实践指南

引言 在深度学习领域&#xff0c;卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而&#xff0c;从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案&#xff0c;它能够将预训练模型的知识…...

Django 入门实战:从环境搭建到构建你的第一个 Web 应用

Django 入门实战&#xff1a;从环境搭建到构建你的第一个 Web 应用 恭喜你选择 Django 作为你学习 Python Web 开发的起点&#xff01;Django 是一个强大、成熟且功能齐全的框架&#xff0c;非常适合构建中大型的 Web 应用程序。本篇将通过一个简单的例子&#xff0c;带你走完…...

【后端】构建简洁的音频转写系统:基于火山引擎ASR实现

在当今数字化时代&#xff0c;语音识别技术已经成为许多应用不可或缺的一部分。无论是会议记录、语音助手还是内容字幕&#xff0c;将语音转化为文本的能力对提升用户体验和工作效率至关重要。本文将介绍如何构建一个简洁的音频转写系统&#xff0c;专注于文件上传、云存储以及…...

http通信之axios vs fecth该如何选择?

在HTTP通信中&#xff0c;axios和fetch都是常用的库或原生API用于发起网络请求。两者各有特点&#xff0c;适用于不同的场景。下面详细介绍它们的差异和各自的优势&#xff1a; fetch 特点&#xff1a; 原生支持&#xff1a;fetch是现代浏览器内置的API&#xff0c;不需要额外…...

iostat指令介绍

文章目录 1. 功能介绍2. 语法介绍3. 应用场景4. 示例分析 1. 功能介绍 iostat (input/output statistics)&#xff0c;是 Linux/Unix 系统中用于监控 CPU 使用率和 磁盘 I/O 性能的核心工具&#xff0c;可实时展示设备负载、吞吐量、队列状态等关键指标。 可以使用 man iostat查…...

NLP高频面试题(五十)——大模型(LLMs)分词(Tokenizer)详解

在自然语言处理(NLP)任务中,将文本转换为模型可处理的数字序列是必不可少的一步。这一步通常称为分词(tokenization),即把原始文本拆分成一个个词元(token)。对于**大型语言模型(LLM,Large Language Model,大型语言模型)**而言,选择合适的分词方案至关重要:分词的…...

桌面我的电脑图标不见了怎么恢复 恢复方法指南

在Windows操作系统中&#xff0c;“我的电脑”或在较新版本中称为“此电脑”的图标&#xff0c;是访问硬盘驱动器、外部存储设备和系统文件的重要入口。然而&#xff0c;有些用户可能会发现桌面上缺少了这个图标&#xff0c;这可能是由于误操作、系统设置更改或是不小心删除造成…...

【Qt】控件的理解 和 基础控件 QWidget 属性详解(通俗易懂+附源码+思维导图框架)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 通过上一章对信号槽的理解相信你对Qt的认识肯定有了很大的进步&#xff0c;下面将通过本篇文章带你深入的认识Widget控件&#xff08;主窗口&#xff0…...

oracle将表字段逗号分隔的值进行拆分,并替换值

需求背景&#xff1a;需要源数据变动&#xff0c;需要对历史表已存的字段值根据源数据进行更新。如果是单字段存值&#xff0c;直接根据映射表关联修改即可。但字段里面若存的值是以逗号分割&#xff0c;比如旧值&#xff1a;‘old1,old2,old3’&#xff0c;要根据映射关系调整…...

用c语言实现——一个带头节点的链队列,支持用户输入交互界面、初始化、入队、出队、查找、判空判满、显示队列、遍历计算长度等功能

一、知识介绍 带头节点的链队列是一种基于链表实现的队列结构&#xff0c;它在链表的头部添加了一个特殊的节点&#xff0c;称为头节点。头节点不存储实际的数据元素&#xff0c;主要作用是作为链表的起点&#xff0c;简化队列的操作和边界条件处理。 1.节点结构 链队列的每…...

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…...

【项目】基于MCP+Tabelstore架构实现知识库答疑系统

基于MCPTabelstore架构实现知识库答疑系统 整体流程设计&#xff08;一&#xff09;Agent 架构&#xff08;二&#xff09;知识库存储&#xff08;1&#xff09;向量数据库Tablestore&#xff08;2&#xff09;MCP Server &#xff08;三&#xff09;知识库构建&#xff08;1&a…...

C语言高频面试题——malloc 和 calloc区别

在 C 语言中&#xff0c;malloc 和 calloc 都是用于动态内存分配的函数&#xff0c;但它们在 内存初始化、参数形式 和 使用场景 上有显著区别。以下是详细的对比分析&#xff1a; 1. 函数原型 malloc void* malloc(size_t size);功能&#xff1a;分配 未初始化 的连续内存块…...

深入探讨JavaScript性能瓶颈与优化实战指南

JavaScript作为现代Web开发的核心语言,其性能直接影响用户体验与业务指标。随着2025年前端应用的复杂性持续增加,性能优化已成为开发者必须掌握的核心技能。本文将从性能瓶颈分析、优化策略、工具使用三个维度,结合实战案例,系统梳理JavaScript性能优化的关键路径。 一、Ja…...

[创业之路-376]:企业法务 - 创业,不同的企业形态,个人承担的风险、收益、税费、成本不同

在企业法务领域&#xff0c;创业时选择不同的企业形态&#xff0c;个人在风险承担、收益分配、税费负担及运营成本方面存在显著差异。以下从个人独资企业、合伙企业、有限责任公司、股份有限公司四种常见形态展开分析&#xff1a; 一、个人承担的风险 个人独资企业 风险类型&…...

【Lua】Lua 入门知识点总结

Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用&#xff0c;包括全局变量和局部变量的区别&#xff0c;以及nil类型的概念、数值型、字符串和函数的基本操作&#xff0c;包括16进制表示、科学计数法、字符串连接、函数声明…...

低空经济 WebGIS 无人机配送 | 图扑数字孪生

2024 年&#xff0c;”低空经济” 首次写入政府工作报告&#xff0c;在政策驱动下各地纷纷把握政策机遇&#xff0c;从基建网络、场景创新、产业生态、政策激励等方面&#xff0c;构建 “规划-建设-应用-赋能” 的系统性布局&#xff0c;作为新质生产力的重要体现&#xff0c;推…...

【程序员 NLP 入门】词嵌入 - 如何基于计数的方法表示文本? (★小白必会版★)

&#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 希望用我的经验&#xff0c;让“程序猿”的AI学习之路走的更容易些&#xff0c;若我的经验能为你前行的道路增添一丝轻松&#xff0c;我将倍感荣幸&#xff01;共勉~ 【程序员 NLP 入门】词…...

基于机器学习的多光谱遥感图像分类方法研究与定量评估

多光谱遥感技术通过获取可见光至红外波段的光谱信息&#xff0c;为地质勘探、农业监测、环境调查等领域提供了重要支持。与普通数码相机相比&#xff0c;多光谱成像能记录更丰富的波段数据&#xff08;如近红外、短波红外等&#xff09;&#xff0c;从而更精准地识别地物特征。…...

BEVDepth: Acquisition of Reliable Depth for Multi-View 3D Object Detection

背景 基于多视角图片的3D感知被LSS证明是可行的,它使用估计的深度将图像特征转化为3D视椎,再将其压缩到BEV平面上。对于这个得到的BEV特征图,它支持端到端训练以及各种下游任务。但是对于深度估计这一块学习的深度质量如何,到目前为止没有相关工作研究。 贡献 本文的贡献…...

【Linux】静态库 动态库

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、&#x1f451;静态库和动态库 静态库&#xff1a; 动态库&#xff1a; &#x1f320;手动制作静态库 && 手动调用一下我们自己写的静态库 1> 安装到系统里面 ✨生成静…...

Java转Go日记(六):TCP黏包

服务端代码如下&#xff1a; // socket_stick/server/main.gofunc process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)var buf [1024]bytefor {n, err : reader.Read(buf[:])if err io.EOF {break}if err ! nil {fmt.Println("read from client…...

(51单片机)LCD显示温度(DS18B20教程)(LCD1602教程)(延时函数教程)(单总线教程)

演示视频&#xff1a; LCD显示温度 源代码 如上图将9个文放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.…...

【通过Docker快速部署Tomcat9.0】

文章目录 前言一、部署docker二、部署Tomcat2.1 创建存储卷2.2 运行tomcat容器2.3 查看tomcat容器2.4 查看端口是否监听2.5 防火墙开放端口 三、访问Tomcat 前言 Tomcat介绍 Tomcat 是由 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;开发的一个开源 …...

云原生--基础篇-3--云原生概述(云、原生、云计算、核心组成、核心特点)

1、什么是云和原生 &#xff08;1&#xff09;、什么是云&#xff1f; “云”指的是云计算环境&#xff0c;代表应用运行的基础设施和资源。依赖并充分利用云计算的弹性、分布式和资源池化能力。 核心含义&#xff1a; 1、云计算基础设施 云原生应用的设计和运行完全基于云…...

Spark-Streaming

Spark-Streaming概述 DStream实操 案例一&#xff1a;WordCount案例 需求&#xff1a;使用 netcat 工具向 9999 端口不断的发送数据&#xff0c;通过 SparkStreaming 读取端口数据并统计不同单词出现的次数 实验步骤&#xff1a; 添加依赖 <dependency> <gro…...

乐视系列玩机------乐视2 x620红灯 黑砖刷写教程以及新版刷写工具的详细释义

乐视x620在上期解析了普通黑砖情况下的救砖刷机过程。但在一些例外的情况下。使用上面的步骤会一直刷写报错 。此种情况就需要另外一种强制刷写方法来救砖 通过博文了解💝💝💝 1💝💝💝-----详细解析乐视2 x620系列 红灯 黑砖线刷救砖的步骤 2💝💝💝----图…...

若依SpringCloud项目-定制微服务模块

若依SpringCloud项目-定制微服务模块 关于微服务先不过多介绍&#xff0c;刚开始熟悉并不能讲的很彻底&#xff0c;成熟的微服务项目-若依SpringCloud就是一个典型的微服务架构工程&#xff08;网上有很多教程了&#xff0c;不明白的可以学习一下&#xff09;。 我正在看的视…...

【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细

批量识别扫描件PDF指定区域内容并重命名文件方案 应用场景 本方案适用于以下场景: 企业档案数字化管理:批量处理扫描的合同、发票等文件,按内容自动分类命名财务票据处理:自动识别票据上的关键信息(如发票号码、日期)用于归档医疗记录管理:从扫描的检查报告中提取患者I…...

学习Docker遇到的问题

目录 1、拉取hello-world镜像报错 1. 检查网络连接 排查: 2. 配置 Docker 镜像加速器(推荐) 具体解决步骤: 1.在服务器上创建并修改配置文件,添加Docker镜像加速器地址: 2. 重启Docker 3. 拉取hello-world镜像 2、删除镜像出现异常 3、 容器内部不能运行ping命令 …...

Docker 数据卷

目录 一、数据卷(Data Volume) 二、使用 1、单独建立数据卷 2、挂载主机数据卷 3、数据卷容器挂载 基本语法: 工作原理: 主要用途: 使用事例: 一、数据卷(Data Volume) 数据卷的使用,类似于 Linux 下对目录或文件进行 mount 数据卷(Data Volume)是一个可供一个或多…...

【数据结构】励志大厂版·初级(二刷复习)双链表

前引&#xff1a;今天学习的双链表属于链表结构中最复杂的一种&#xff08;带头双向循环链表&#xff09;&#xff0c;按照安排&#xff0c;我们会先进行复习&#xff0c;如何实现双链表&#xff0c;如基本的头插、头删、尾删、尾插&#xff0c;掌握每个细节&#xff0c;随后进…...

通过dogssl申请ssl免费证书

SSL证书作为实现HTTPS加密的核心工具&#xff0c;能够确保用户与网站之间的数据传输安全。尤其是在小程序之类的开发时&#xff0c;要求必须通过https发起请求的情况下。学会如何免费申请一个ssl证书就很有必要了。这里我分享一下&#xff0c;我通过dogssl如何申请ssl的。 一&…...

路由与路由器

路由的概念 路由是指在网络通讯中&#xff0c;从源设备到目标设备路径的选择过程。路由器是实现这一过程的关键设备&#xff0c;它通过转发数据包来实现网络的互联。路由工作在OSI参考模型的第三层&#xff0c;‘网络层’。 路由器的基本原理 路由器通过维护一张路由表来决定…...

Docker底层原理浅析 | namespace+cgroups+文件系统

本文目录 1. Linux NamespaceLinux系统里是否只能有一个pid为1的进程&#xff1f;namespace机制查看namespacenamespace机制测试使用Docker验证namespace机制 2. Dcoerk网络模式3.Control groups4.文件系统&#xff08;联合文件系统&#xff09;5. 容器格式 1. Linux Namespace…...

【无人机】使用扩展卡尔曼滤波 (EKF) 算法来处理传感器测量,各传感器的参数设置,高度数据融合、不同传感器融合模式

目录 #1、IMU #2、磁力计 #3、高度 #典型配置 #4、气压计 #静压位置误差修正 #气压计偏置补偿 #5、全球导航系统/全球定位系统--GNSS/GPS #位置和速度测量 #偏航测量 #GPS 速度的偏航 #双接收器 #GNSS 性能要求 #6、测距 #条件范围辅助-Conditional range aidin…...

常见的raid有哪些,使用场景是什么?

RAID&#xff08;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff09;是一种将多个物理硬盘组合成一个逻辑硬盘的技术&#xff0c;目的是通过数据冗余和/或并行访问提高性能、容错能力和存储容量。不同的 RAID 级别有不同的实现方式和应用场景。以下…...

《 C++ 点滴漫谈: 三十四 》从重复到泛型,C++ 函数模板的诞生之路

一、引言 在 C 编程的世界里&#xff0c;类型是一切的基础。我们为 int 写一个求最大值的函数&#xff0c;为 double 写一个相似的函数&#xff0c;为 std::string 又写一个……看似合理的行为&#xff0c;逐渐堆积成了难以维护的 “函数墙”。这些函数逻辑几乎一致&#xff0…...

EasyRTC打造无人机低延迟高清实时通信监控全场景解决方案

一、方案背景 随着无人机技术的飞速发展&#xff0c;其在航拍、物流配送、农业监测、应急救援等多个领域的应用日益广泛。然而&#xff0c;无人机在实际作业过程中面临着诸多挑战&#xff0c;如通信延迟、数据传输不稳定、监控范围有限等。EasyRTC作为一种高效、低延迟的实时通…...