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

深入解析Spring Boot配置处理器:机制、架构与实践


深入解析Spring Boot配置处理器:机制、架构与实践

Spring Boot的配置处理器(spring-boot-configuration-processor)是支撑其智能配置体验的关键组件。本文结合实际开发需求,从使用方式、底层原理到性能优化与架构设计,系统解析这一核心机制,帮助开发者构建更智能、更高效的配置系统。


一、配置处理器的基本功能

1. 作用与机制

配置处理器通过注解处理器在编译期扫描 @ConfigurationProperties 类,生成 META-INF/spring-configuration-metadata.json 元数据文件,为IDE提供属性提示、类型校验和描述信息支持。

2. 使用示例

@Component
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceConfig {private String url;private int maxPoolSize = 100;// Getter/Setter
}

application.properties 中输入 app.datasource. 时,将出现 urlmaxPoolSize 的自动补全提示。

3. Maven依赖配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

建议使用 optional 避免将其打入最终构建产物。


二、高级集成与安全实践

1. 与Spring Boot Admin集成

配置处理器生成的元数据可被Spring Boot Admin读取,展示实时配置状态。结合如下配置实现客户端注册:

spring.boot.admin.client.url=http://localhost:8080
management.endpoints.web.exposure.include=*

2. 安全注意事项

  • 防配置注入漏洞:如CVE-2022-22965,避免暴露敏感属性。
  • 权限控制:暴露管理端点时,务必结合Spring Security配置访问控制。

3. 性能优化

  • 延迟初始化:启用 spring.main.lazy-initialization=true 可加快启动速度。
  • 类路径索引:引入 spring-context-indexer 生成组件索引,加速Bean加载。

三、架构原理与核心模块

1. 编译期处理流程

模块作用技术实现
ConfigurationMetadataAnnotationProcessor注解处理器入口基于JSR 269
JavaCompilerFieldValuesParser解析AST抽取字段访问者模式 + DFS
JsonMarshaller元数据序列化JSON Schema驱动

2. 类型推导系统

通过组合 TypeMirrorElement 分析泛型和注解信息,实现静态类型安全。

3. 持久化与验证

生成的 JSON 结构遵循 Spring 定义的元数据契约,支持通过 Schema 验证防止不合规项。


四、设计模式与软件工程思想

1. 关键设计模式

  • 访问者模式:用于语法树遍历(如 TreeVisitor)。
  • 策略模式:在 FieldValuesParser 中切换不同的解析策略。
  • 双重调度:解决AST节点类型差异,保持代码扩展性。
  • 空对象模式:应对缺失配置字段时的默认值场景。

2. 元编程与契约优先

配置处理器是典型的元编程应用,在编译期生成运行时可读的配置契约。这种契约驱动方式提高了系统的可预测性和可维护性。


五、实用工具链与项目配置建议

工具功能推荐配置
DevTools热部署spring-boot-devtools
Lombok简化POJO@Data, @Builder
Actuator应用健康检查启用 /actuator/health

六、问题排查与调试技巧

  • 绑定失败:类型不匹配或缺少Setter,需自定义转换器并标注 @ConfigurationPropertiesBinding
  • 元数据未生成:检查IDE是否启用注解处理,并确认Maven依赖正确声明。

七、底层实现解构:面向工程师的架构解读

1. AST语法树解析

  • 使用 com.sun.source.util.Trees 获取AST节点
  • 遍历策略采用DFS,收集字段注解与默认值

2. 编译优化与缓存

  • 使用WeakReference缓存解析结果
  • 实现增量构建:通过元数据指纹避免重复处理

3. 可扩展性设计

  • SPI接口开放如 ValueProvider,支持属性提示插件化
  • 支持输出多格式(如YAML)扩展

八、测试与验证机制

  • 编译期测试:借助 google-testing-compile 验证处理器行为
  • 黄金文件测试:对比生成的元数据文件是否符合预期
  • 模糊测试:构造边界配置,验证稳定性与容错性

九、未来发展趋势

  1. 智能推荐:结合历史项目数据,自动生成配置建议
  2. 热更新机制:结合Spring Cloud Config,实现配置实时刷新
  3. WASM支持:面向WebAssembly环境生成通用配置描述
  4. LSP协议拓展:提升IDE中对配置项的语义提示体验

十、推荐资料

  • Spring 官方文档 - Configuration Metadata
  • 《Java注解处理器权威指南》
  • 《编译器设计》(Keith Cooper)
  • OOPSLA’18: A Type System for Configuration Metadata Validation

总结

Spring Boot配置处理器以其注解驱动、契约优先和编译期增强的理念,构建出一套高可维护、强扩展、对IDE友好的配置系统。对其深入理解,不仅有助于掌握Spring Boot核心机制,更能为自定义注解处理器、元数据驱动开发提供清晰范式。

相关文章:

深入解析Spring Boot配置处理器:机制、架构与实践

深入解析Spring Boot配置处理器&#xff1a;机制、架构与实践 Spring Boot的配置处理器&#xff08;spring-boot-configuration-processor&#xff09;是支撑其智能配置体验的关键组件。本文结合实际开发需求&#xff0c;从使用方式、底层原理到性能优化与架构设计&#xff0c…...

Ragflow新建的知识库完成后刷新却没有显示,报错MethodNotAllowed: 405 Method Not Allowed:

环境: Ragflow17.2 debian12.8 问题描述: Ragflow新建的知识库完成后刷新却没有显示,报错MethodNotAllowed: 405 Method Not Allowed: The method is not allowed for the requested URL. 后台日志: 2025-04-25 13:54:25,988 ERROR 235204 405 Method Not Allowed:…...

Maven进阶知识

一、Maven 坐标 &#xff08;一&#xff09;概念 在 Maven 中坐标是构件的唯一标识&#xff0c;其元素包括 groupId、artifactId、version、packaging、classifier。其中 groupId、artifactId、version 是必定义项&#xff0c;packaging 默认为 jar。 &#xff08;二&#x…...

通过门店销售明细表用SQL得到每月每个门店的销冠和按月的同比环比数据

假设我在Snowflake里有销售表&#xff0c;包含ID主键、门店ID、日期、销售员姓名和销售额&#xff0c;需要统计出每个月所有门店和各门店销售额最高的人&#xff0c;不一定是一个人&#xff0c;以及他所在的门店ID和月总销售额。 统计每个月份下&#xff0c;各门店内销售额最高…...

聊聊Spring AI Alibaba的YuQueDocumentReader

序 本文主要研究一下Spring AI Alibaba的YuQueDocumentReader YuQueDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-yuque/src/main/java/com/alibaba/cloud/ai/reader/yuque/YuQueDocumentReader.java public class YuQueDocument…...

Tauri文件系统操作:桌面应用的核心能力(入门系列四)

今天我们来聊聊Tauri中一个超级重要的功能 - 文件系统操作。这可是Web应用和桌面应用最大的区别之一。在浏览器里&#xff0c;出于安全考虑&#xff0c;我们对文件系统的访问被限制得死死的。但在Tauri桌面应用中&#xff0c;我们可以安全地访问用户的文件系统&#xff0c;这简…...

网络流之最大流(Dinic)

正文 在了解了Ford-Fulkerson 和Edmonds-Karp之后&#xff0c;我们可以进一步学习更高效的算法——Dinic。 Dinic算法的时间复杂度是O(VE)&#xff0c;实际运用过程中是比EK算法快的。 特性Ford-FulkersonEdmonds-Karp (EK)Dinic 增广路径选择 任意方式BFS找最短路径分层图多…...

LVGL模拟器:NXP GUIDER+VSCODE

1. 下载安装包 NXP GUIDER&#xff1a;GUI Guider | NXP 半导体 CMAKE&#xff1a;Download CMake MINGW&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases SDL2&#xff1a;https://github.com/libsdl-org/SDL/releases/tag/release-2.30.8 VSCODE&…...

魔幻预言手游》:职业介绍!

在《魔幻预言》手游中&#xff0c;共有武玄、魔魅、剑仙三大核心职业&#xff0c;各具特色且定位鲜明&#xff0c;以下为具体介绍&#xff1a; 一、武玄&#xff08;战士&#xff09; 核心定位&#xff1a;近战物理输出与团队增益担当&#xff0c;兼具控制与防御能力。 战斗风…...

什么时候使用Python 虚拟环境(venv)而不用conda

是的&#xff01;python3.9 -m venv rtdetr_env 是 Python 原生的虚拟环境&#xff08;venv&#xff09;&#xff0c;而 conda 是另一个流行的虚拟环境管理工具&#xff08;来自 Anaconda/Miniconda&#xff09;。下面我会详细对比两者的区别&#xff0c;并讲解 venv 的基本用法…...

Vue3的内置组件 -实现过渡动画 TransitionGroup

Vue3的内置组件 -实现过渡动画 TransitionGroup 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果 支持和 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器&#xff0c;但有以下几点区别&#xff1a; 默认情况下&…...

水果成篮--LeetCode

题目 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水…...

ROS 快速入门教程05

15. IMU航向锁定的节点 编写锁定节点 打开vscode编写imu_node.cpp #include<ros/ros.h> #include<sensor_msgs/Imu.h> #include<tf/tf.h> #include<geometry_msgs/Twist.h>ros::Publisher vel_pub;void IMUCallback(sensor_msgs::Imu msg) {if(msg.o…...

用 C 语言实现通用的冒泡排序算法

在日常编程中&#xff0c;排序算法是一个非常常见且重要的工具。虽然有许多排序算法可以选择&#xff0c;但如果你需要一个能够处理不同数据类型的排序算法&#xff0c;如何设计一个通用的排序算法呢&#xff1f;今天我们将实现一个通用的冒泡排序算法&#xff0c;支持不同数据…...

Linux——进程间通信

目录 1. 进程间通信的介绍 1.1 概念 1.2 目的 1.3 进程间通信的本质 1.4 进程间通信的分类 2. 管道 2.1 概念 2.2 匿名管道 2.2.1 原理 2.2.2 pipe函数 2.2.3 匿名管道使用步骤 2.2.4 管道读写规则 2.2.5 管道的特点 2.2.6 管道的四种特殊情况 2.2.7 管道的…...

深入详解人工智能数学基础——微积分中拉格朗日乘数法在GAN训练中的应用

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

精益数据分析(26/126):依据商业模式确定关键指标

精益数据分析&#xff08;26/126&#xff09;&#xff1a;依据商业模式确定关键指标 在创业与数据分析的探索之路上&#xff0c;每一次的学习都像是为前行点亮一盏灯。今天&#xff0c;我们依旧怀揣着共同进步的期望&#xff0c;深入解读《精益数据分析》的相关内容&#xff0…...

前端面试宝典---vue原理

vue的Observer简化版 class Observer {constructor(value) {if (!value || typeof value ! object) returnthis.walk(value) // 对对象的所有属性进行遍历并定义响应式}walk (obj) {Object.keys(obj).forEach(key > defineReactive(obj, key, obj[key]))} } // 定义核心方法…...

Cribl 上传lookup 表,传入数据进event

cribl 插入lookup 表,来数据有针对性的插入字段,对event 的数据进行字段插入。灵活性强。 The Lookup At long last, were ready to configure the lookup. First, lets create the Lookup table wed like to use. Getting the goods 先下载一个lookup 表,然后上传到cri…...

使用 binlog2sql 闪回 MySQL8 数据

【说明】 MySQL服务器版本 8.0.26 mysql> SELECT version(); ----------- | version() | ----------- | 8.0.26 | -----------Python 版本 Python 3.8.10 [infuq ~]# python -V Python 3.8.10【安装】 binlog2sql 官方地址 1.安装 binlog2sql [infuq ~]# git clone …...

蓝桥杯赛场反思:技术与心态的双重修炼

蓝桥杯赛场反思&#xff1a;技术与心态的双重修炼 在刚刚结束的第十六届蓝桥杯大赛软件赛省赛第二场中&#xff0c;我经历了一场充满挑战与自我审视的旅程。走出赛场&#xff0c;内心既有些许成就感&#xff0c;也夹杂着对自身不足的深刻反思。这次比赛不仅是一次技术的较量&a…...

介绍常用的退烧与消炎药

每年春夏交替之季&#xff0c;是感冒发烧、咳嗽、咽喉肿痛、支气管炎、扁桃体炎的高发期。在家里或公司&#xff0c;常备几种预防感冒发烧、咳嗽、流鼻涕、咽喉发炎的药品&#xff0c;是非常必要的。下面介绍几款效果非常明显的中成药、西药&#xff0c;具体如下。 1 莲芝消炎…...

C++篇——继承

目录 引言 1.继承的概念及定义 1_1&#xff0c;继承的概念 1_2&#xff0c; 继承定义 1_2_1&#xff0c;继承关系和访问限定符 1_2_2&#xff0c;继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 构造函数 拷贝构造…...

C++ 基础综合练习案例01:联系人管理系统(Part01)

通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统 系统中需要实现的功能如下&#xff1a; * 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人…...

Trae 宝藏功能实测:从 Mcp 搭建天气系统,到 AI 重塑 Excel 数据处理

本文 利用trae以及第三方MCP Server搭建一个天气系统网页前言链接高德地图MCP链接quickchart-server MCP Server链接EdgeOne Pages Deploy MCP智能体的创建天气系统效果展示 利用trae做一个Excel格式化工具前言使用trae完成代码的实现总结 我正在参加Trae「超级体验官」创意实践…...

MCP与Sequential Thinking:系统问题的分解与解决之道

MCP与Sequential Thinking:系统问题的分解与解决之道 引言:复杂问题背后的逻辑思维 在面对复杂问题时,我们常常感到手足无措,尤其是在需要将任务分解为多个步骤时。这是对个人思维能力的极大挑战,而掌握有效的思维工具则可以让事情事半功倍。今天我们讨论的两个工具:MC…...

Scrapy爬取动态网页:简洁高效的实战指南

引言 动态网页依赖JavaScript加载,传统爬虫望而却步。Scrapy搭配scrapy-splash却能轻松破局!本文通过一个原创案例,带你用Scrapy和Splash高效爬取动态网页,代码简洁、可运行,从零基础到进阶开发者都能快速上手。无论是数据采集还是自动化任务,这篇指南让你一学即会,开启…...

在 Linux 上安装 PNPM 的教程

在 Linux 上安装 PNPM 的教程 PNPM&#xff08;Performant NPM&#xff09;是一个非常快速的包管理器&#xff0c;作为 npm 的替代品&#xff0c;PNPM 在安装速度和磁盘占用方面都具有显著优势。PNPM 通过“硬链接”共享依赖来节省磁盘空间&#xff0c;并且比 npm 更加高效。本…...

Vue3 组件通信与插槽

Vue3 组件通信方式全解&#xff08;10种方案&#xff09; 一、组件通信方式概览 通信方式适用场景数据流向复杂度Props/自定义事件父子组件简单通信父 ↔ 子⭐v-model 双向绑定父子表单组件父 ↔ 子⭐⭐Provide/Inject跨层级组件通信祖先 → 后代⭐⭐事件总线任意组件间通信任…...

php一些命名规范 和 css命名规范

一 php命名规范 $myName bill gates;$yourFamilyName ggbone; 1.1 变量命名 变量以美元符号 $ 开头, 第一个字符不可以是数字 &#xff0c;除了下划线_ 不能有任何符号 $name bill;$age 33; 当用2个或2个以上的单词命名变量时&#xff0c;可以使用驼峰法规则&#xff08…...

【TypeScript】速通篇

目录 0 前言 1 准备工作 1.1 安装typescript包 1.2 简化运行TS 2 类型注解 2.1 常用类型 2.1.1 原始类型 2.1.2 数组类型 2.1.3 联合类型 2.1.3.1 类型别名 2.1.4 函数类型 2.1.4.1 void类型 2.1.4.2 可选参数 2.1.5 对象类型 2.1.5.1 可选属性 2.1.5.2 接口 2.…...

flutter 引擎初始化

在 Flutter 混合开发中&#xff0c;iOS 端的 ​​Flutter 引擎初始化时机​​ 取决于集成方式&#xff08;纯 Flutter 或混合开发&#xff09;。以下是详细分析&#xff1a; ​​1. 纯 Flutter 应用&#xff08;默认 Flutter App&#xff09;​​ ​​初始化时机​​ ​​启动…...

Spring Boot 连接 Microsoft SQL Server 实现登录验证

Spring Boot 连接 Microsoft SQL Server 实现登录验证 这篇文章将非常系统地讲解如何使用 Spring Boot 结合 Microsoft SQL Server 2019 完成一个完整的登录验证系统&#xff0c;包括数据库连接问题、SSL证书错误处理、CORS跨域详细解释和解决方案。 适合需要前后端联调、单独…...

腾讯云智三道算法题

import java.math.BigDecimal; import java.math.BigInteger; import java.util.*;public class MyMain {//第一题&#xff1a;一个水果切成n块public static void getRes(int n, int l, int r){int min -1;int max -1;for (int il;i<r;i){if (i%n0){min i/n;break;}}for…...

语音合成之七语音克隆技术突破:从VALL-E到SparkTTS,如何解决音色保真与清晰度的矛盾?

从VALL-E到SparkTTS&#xff0c;如何解决音色保真与清晰度的矛盾&#xff1f; 引言语音克隆技术发展史YourTTS&#xff1a;深入剖析架构与技术VALL-E&#xff1a;揭秘神经编解码语言模型MaskGCTSparkTTS&#xff1a;利用 LLM 实现高效且可控的语音合成特征解耦生成式模型特征解…...

【Pandas】pandas DataFrame rdiv

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

maven打包时配置多环境参数

1. pom配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…...

【Linux】基本指令(下)

目录 一、详解指令补充知识1&#xff1a;什么是压缩 19. zip 指令&#xff08;1&#xff09;-r 选项&#xff08;2&#xff09;zip 和 unzip 的安装 20. unzip 指令&#xff08;1&#xff09;-d 选项补充知识2&#xff1a;本地机器与云服务器补充知识3&#xff1a;本地机器与云…...

NVLink、UALink 崛起,PCIe Gen6 如何用 PAM4 迎战未来?

现在数字经济发展地相当快速&#xff0c;像Cloud、现在火红的AI、大数据这些新技术都需要在数据中心里运行更多运算&#xff0c;伴随而来的是更快的数据传输速度的需求。 在数据中心&#xff0c;有很多条数据传输路径&#xff0c;举例 &#xff1a; Server 和Storage之间&…...

23种设计模式-行为型模式之迭代器模式(Java版本)

Java 迭代器模式&#xff08;Iterator Pattern&#xff09;详解 &#x1f9e0; 什么是迭代器模式&#xff1f; 迭代器模式是一种行为型设计模式&#xff0c;它提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露该对象的内部表示。 &#x1f3af; 使用场景 …...

指标监控:Prometheus 结合 Grafana,监控redis、mysql、springboot程序等等

软件作用说明 ‌Prometheus‌&#xff1a;采集各种指标数据&#xff08;如CPU、内存、请求数&#xff09;&#xff0c;并存储到时序数据库中。‌Grafana‌&#xff1a;数据可视化&#xff0c;生成监控仪表盘。 架构说明 被监控服务&#xff08;如Redis/MySQL/SpringBoot&a…...

微信小程序,基于uni-app的轮播图制作,调用文件中图片

以便捷为目的&#xff0c;想使用文件中的图片制作轮播图 但网上找到的都是轮播图彼此分割&#xff0c;没有使用数组存储在一起&#xff0c;不便于管理&#xff0c;代码不美观简洁 作者使用文件中的图片&#xff0c;并使用数组制作轮播图的具体操作如下&#xff1a;&#xff0…...

未来医院已来:AI如何实现无死角安全监控

AI智慧医院如何用算法守护安全与效率 ## 背景&#xff1a;医疗场景的智能化转型需求 现代医院作为人员密集、场景复杂的公共场所&#xff0c;面临诸多管理痛点&#xff1a;患者跌倒可能延误救治、医闹事件威胁安全、医疗垃圾处置不当引发感染风险、重点区域&#xff08;如药…...

搭建动态SQL取数

日常取数的时候可能会存在动态SQL的问题&#xff0c;比如取数动态或者条件动态等情况&#xff0c;下面针对动态SQL做一个完整的处理。包括SELECT 、FROM、WHERE 以及 最后table的动态。 首先 数据定义&#xff0c;这里全按照表来append处理 TYPES:BEGIN OF ty_data,edpline T…...

Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值

目录 函数简介 函数定义&#xff0c;调用&#xff0c;传入参数&#xff0c;返回值 函数的定义 函数的调用和传入参数 函数的返回值 函数简介 函数简介&#xff1a;函数是组织好&#xff0c;可重复使用&#xff0c;用来实现特定功能&#xff08;特定需求&#xff09;的代码…...

下垂控制属于构网型控制技术

下垂控制属于构网型控制&#xff0c;而非跟网型控制。 一、构网型与跟网型控制的本质区别 控制策略差异 构网型控制&#xff08;Grid-Forming Control, GFM&#xff09;&#xff1a; 通过模拟同步发电机的特性&#xff08;如转子运动方程&#xff09;&#xff0c;自主构建电压幅…...

主流 LLM 部署框架

主流 LLM 部署框架 框架主要特点适用场景vLLM- 超快推理&#xff08;高吞吐&#xff09; - 动态批处理 - 支持 HuggingFace Transformer - 支持 PagedAttention高并发、低延迟在线推理TGI (Text Generation Inference)- Huggingface官方出品 - 多模型管理 - 支持动态量化 - 支持…...

数据库系统概论(四)关系操作,关系完整性与关系代数

数据库系统概论&#xff08;四&#xff09;详细讲解关系操作&#xff0c;关系完整性与关系代数 前言一、什么是关系操作1.1 基本的关系操作1.2 关系数据语言的分类有哪些 二、关系的完整性2.1 实体完整性2.2 参照完整性2.3 用户的定义完整性 三、关系代数是什么3.1 传统的集合运…...

C#里使用libxl来加载网络传送过来的EXCEL文件

从服务器传送过来的数据,是一个EXCEL文件, 那么怎么样获取里面的数据比较合适呢? 是不是把数据先保存到文件,再使用传统的方式打开它呢? 其实这样做,也是可以的,对于比较大的文件来说。 如果文件比较小,就不必要这样做了,可以直接保存在内存,然后使用函数LoadRaw…...

Make + OpenOCD 完成STM32构建+烧录

目录 前言 准备工作 开始操作 后记 前言 前两篇通过VSCodeSTM32CubeMx跑通了用EIDE构建烧录。为今天的工作打下了非常棒的基础&#xff01;今天来尝试手动构建烧录。 准备工作 安装Make&#xff0c;我这次用的是Win10&#xff0c;所以需要安装一个新朋友 msys2 &#xff0…...