【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践

news2025/5/22 18:40:03


目录

1.前言

2.正文

2.1配置文件的格式

2.2properties

2.2.1基础语法

2.2.2value读取配置文件

2.2.3缺点

2.3yml

2.3.1基础语法

2.3.2配置不同数据类型

2.3.3配置读取

2.3.4配置对象和集合

2.3.5优缺点

2.4综合练习:验证码案例

2.4.1分析需求

2.4.2接口

2.4.3介绍hutool

2.4.4代码实现

2.4.4.1后端实现

2.4.4.2前端核心实现

3.小结


1.前言

哈喽大家好吖,在Spring Boot项目中,配置文件是连接代码与环境的桥梁,直接影响着应用的可维护性和扩展性。面对传统的Properties格式与新兴的YAML格式,开发者该如何选择?它们的语法差异是什么?如何高效读取复杂配置?本文将从基础语法、数据类型支持、配置读取方式、对象/集合映射等维度,深入解析两种配置文件的特性,并结合实际代码演示,助你在项目中做出最合理的技术选型!

2.正文

2.1配置文件的格式

在Spring框架中,配置文件是应用程序的重要组成部分,它允许我们将配置信息从代码中分离出来,实现配置与代码的松耦合。Spring支持多种配置文件格式,其中最常用的两种是:

  1. .properties文件:传统的键值对格式

  2. .yml.yaml文件:基于缩进的层次结构格式

这两种格式各有优缺点,开发者可以根据项目需求和个人偏好进行选择。接下来我们将详细探讨这两种配置格式的特点和使用方法。

2.2properties

2.2.1基础语法

Properties 文件是 Spring Boot 中最传统的配置文件格式,采用简单的 键值对(Key-Value) 形式定义配置,语法清晰但灵活性较低。以下是核心语法规则和示例:


键值对格式:

每行定义一个配置项,格式为 key=value

  • key 是配置项的唯一标识,支持 . 分隔的层级命名(如 db.url)。

  • value 可以是字符串、数字、布尔值等,默认按字符串处理。

# 示例:数据库配置
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=123456

注释:

使用 # 或 ! 开头添加注释,解释配置用途:

# 服务器端口配置
server.port=8080
! 开发环境开关
dev.mode=true

特殊字符处理:

  • 若 value 包含空格、等号或冒号,需用反斜杠 \ 转义:

    error.message=参数\ 不能为空!
    special.symbol=key\=value
  • Unicode 字符支持:非 ASCII 字符(如中文)需转换为 Unicode 编码:

    greeting=\u4F60\u597D(表示“你好”)

2.2.2value读取配置文件

在 Spring 中,可通过 @Value 注解或 Environment 对象直接读取配置值。

1.@Value 注解

  • 直接在字段上使用 @Value("${key}") 注入配置值。

  • 支持设置默认值(当配置项不存在时生效):

    @Component
    public class DatabaseConfig {
        @Value("${db.url:jdbc:mysql://default}") // 默认值
        private String url;
        
        @Value("${db.username}")
        private String username;
    }

2.Environment 对象

  • 注入 Environment 对象,通过 getProperty() 动态获取配置:
    @Autowired
    private Environment env;
    
    public void printConfig() {
        String password = env.getProperty("db.password");
        Integer port = env.getProperty("server.port", Integer.class); // 自动类型转换
    }

3.类型转换

  • 非字符串类型(如整数、布尔值)需手动转换:
    @Value("${server.port}")
    private int port; // Spring 自动转换为 int 类型
    
    @Value("${feature.enabled:false}") // 默认值 false
    private boolean isEnabled;

2.2.3缺点

尽管 Properties 格式简单易用,但在复杂项目中存在明显短板:

1.层级结构缺失

所有配置项平铺展示,缺乏逻辑分组。

对比示例

# Properties 格式
user.name=Alice
user.age=25
user.address.city=Beijing
# yml 等效配置(结构更清晰)
user:
  name: Alice
  age: 25
  address:
    city: Beijing

2.重复前缀冗余

相同前缀的配置需重复书写,导致冗余:

redis.cache.host=127.0.0.1
redis.cache.port=6379
redis.cache.timeout=30

3.复杂类型支持不足

无法直接定义集合或对象,需手动拆分或借助特殊格式:

# 列表需用逗号分隔,代码中需手动解析
server.ports=8080,8081,8082

# 对象需拆分为多个键值对
book.title=Spring Guide
book.author=John Doe

2.3yml

2.3.1基础语法

YAL是一种以层级缩进为核心的配置文件格式,语法简洁且可读性强。以下是核心规则:

层级结构

  • 使用 空格缩进 表示层级关系(禁止用 Tab 键)。

  • 同一层级的元素左对齐,缩进空格数需一致。

  • server:
      port: 8080       # 正确:server 下的子层级缩进 2 空格
      servlet:
        context-path: /api  # servlet 的子层级继续缩进

键值对

  • 键与值之间用 : 分隔,冒号后必须加 一个空格

  • 字符串默认不加引号,特殊字符(如 :#)可用双引号包裹。

    name: Spring Boot    # 普通字符串
    version: "3.2.0"     # 引号可省略,但推荐明确
    message: "Hello:World"  # 包含冒号,需用引号

注释

  • 单行注释以 # 开头。

    # 服务器配置
    server:
      port: 8080  # 开发环境端口

多行文本

  • 用 | 保留换行符,或用 > 折叠换行符。

    description: |       # 保留换行
      This is a
      multi-line
      text.
    
    summary: >           # 折叠为一行(换行符转空格)
      This is a 
      single-line text.

2.3.2配置不同数据类型

YML 自动识别数据类型,无需手动转换,支持以下常见类型:

字符串

path: /api/v1     # 普通字符串
error: "Error: 404\nPage not found."  # 包含冒号和换行符

默认不加引号,特殊字符用双引号包裹(支持转义符如 \n)。

数值

int: 100
float: 3.14
scientific: 6.022e23  # 科学计数法

整数、浮点数直接书写,支持科学计数法。

布尔值

enabled: true
debug-mode: False  # 实际解析为 false

使用 true/false(不区分大小写)。

日期

create-date: 2023-10-01    # 日期
timestamp: 2023-10-01T12:00:00+08:00  # 日期时间

遵循 ISO 8601 格式,如 yyyy-MM-dd

null 值

description: null
value: ~

用 null 或 ~ 表示。

2.3.3配置读取

YML 配置的读取方式与 Properties 类似,但更推荐对象绑定以发挥层级优势。

@Value 注解

@Value("${server.port}")
private int port;

@Value("${user.name}")
private String userName;

直接注入单个配置值(与 Properties 一致)。

@ConfigurationProperties 绑定对象

# YML 配置
database:
  url: jdbc:mysql://localhost/test
  username: root
  pool-size: 10
@Component
@ConfigurationProperties(prefix = "database")
public class DatabaseConfig {
    private String url;
    private String username;
    private int poolSize;  // 支持驼峰命名自动匹配(pool-size → poolSize)
    // Getter & Setter
}

将层级配置映射到 Java 对象的字段,适合复杂配置。

Environment 对象

@Autowired
private Environment env;

public void readConfig() {
    String url = env.getProperty("database.url");
    int poolSize = env.getProperty("database.pool-size", Integer.class);
}

动态获取配置值,支持类型转换。

2.3.4配置对象和集合

YML 天然支持复杂数据结构的定义,无需拆分键名。

对象嵌套

user:
  name: Alice
  age: 25
  address:       # 嵌套对象
    city: Beijing
    street: Zhongguancun

Java 实体类绑定:

@ConfigurationProperties(prefix = "user")
public class User {
    private String name;
    private int age;
    private Address address;  // 内部类 Address 需定义 city 和 street 字段
}

通过缩进表示对象层级。

集合(List 和 Map)

# List 示例
servers:
  - 192.168.1.1
  - 192.168.1.2

# Map 示例(两种写法等效)
config:
  properties: 
    key1: value1
    key2: value2
  # 或
  properties: {key1: value1, key2: value2}

Java 实体类绑定:

@ConfigurationProperties(prefix = "servers")
public class ServerList {
    private List<String> servers;  // 自动映射 List
}

@ConfigurationProperties(prefix = "config")
public class AppConfig {
    private Map<String, String> properties;  // 自动映射 Map
}

List:用 - 表示列表项。

Map:直接写键值对或使用 {}

2.3.5优缺点

优点

  1. 结构清晰:层级缩进直观展示配置关系,适合复杂业务场景。

  2. 类型丰富:自动识别字符串、数值、布尔值、日期等类型。

  3. 代码简洁:通过 @ConfigurationProperties 一键绑定对象,减少冗余代码。

  4. 多行文本支持:无需拼接符即可定义长文本。

缺点

  1. 缩进敏感:缩进错误(如混用空格和 Tab)会导致解析失败。

  2. 兼容性限制:旧版本 IDE 或工具可能不支持 YAML(需安装插件)。

  3. 学习成本:对新手来说,层级规则和语法细节需时间熟悉。

2.4综合练习:验证码案例

源码:src/main/java/captcha · 爱吃烤鸡翅的酸菜鱼/springboot学习 - 码云 - 开源中国https://gitee.com/crjs-hao/springboot/tree/master/src/main/java/captcha

2.4.1分析需求

  1. 页面生成验证码。
  2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳转。

2.4.2接口

1. 生成验证码

请求URL/captcha/getCaptcha
响应:验证码图片内容
说明:浏览器向服务器发送/captcha/getCaptcha请求,服务器返回验证码图片并在浏览器页面显示。

2. 校验验证码是否正确

请求URL/captcha/check
请求参数captcha=xn8d
参数说明captcha为用户输入的验证码。
响应truefalse
说明:根据用户输入的验证码校验是否正确,true表示验证成功,false表示验证失败。 

2.4.3介绍hutool

官网:Hutool🍬一个功能丰富且易用的Java工具库

官方文档:简介 | Hutool

特点:

✅ 简单易用:方法命名直观,API 设计友好,降低学习成本。
✅ 功能全面:涵盖 Java 开发中的常见工具需求,减少依赖第三方库。
✅ 高性能:优化底层实现,避免重复造轮子。
✅ 模块化设计:可按需引入特定模块,避免项目臃肿。

maven引入依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version> <!-- 使用最新版本 -->
</dependency>

2.4.4代码实现

代码结构:

先配置好yml文件:

spring:
  application:
    name: springboot
captcha:
  width: 150
  height: 50
  session:
    key: CAPTCHA_SESSION_KEY
    date: CAPTCHA_SESSION_DATE
2.4.4.1后端实现
@RequestMapping("/captcha")
@RestController
public class CaptchaController {

    @Autowired
    private CaptchaPropertities captchaPropertities;

    private final static Long VALID_TIME = 30 * 60 * 1000L;

    @RequestMapping("/getCaptcha")
    public void getCaptcha(HttpServletResponse response, HttpSession session){
        response.setContentType("image/jpg");
        response.setCharacterEncoding("utf-8");
        //生成验证码
        try {
            ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(captchaPropertities.getWidth(), captchaPropertities.getHeight());
            String code = captcha.getCode();
            session.setAttribute(captchaPropertities.getSession().getKey(), code);
            session.setAttribute(captchaPropertities.getSession().getDate(), new Date());

            captcha.write(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
//        }finally {
//            response.getOutputStream().close();
//        }
    }

    /**
     * 验证用户输入的验证码是否正确
     * @param captcha: 用户输入的验证码
     * @param session
     * @return false: 校验失败, true: 成功
     */

    @RequestMapping("/check")
    public boolean check(String captcha,HttpSession session){
        if(!StringUtils.hasLength(captcha)){
            return false;
        }

        String code = (String) session.getAttribute(captchaPropertities.getSession().getKey());
        Date date = (Date) session.getAttribute(captchaPropertities.getSession().getDate());
        //验证码正确且没有过期
        if(captcha.equalsIgnoreCase(code) && date != null && System.currentTimeMillis() - date.getTime() < VALID_TIME){
            return true;
        }
        return false;
    }
}

 1. 验证码生成流程 (/getCaptcha)

  1. 初始化响应

    • 设置响应类型为图片 (image/jpg) 和字符编码 (utf-8)。

  2. 生成验证码

    • 使用 Hutool 的 ShearCaptcha 工具生成指定宽高的图形验证码。

    • 获取验证码文本 (code) 并存入 Session,同时记录生成时间。

  3. 返回验证码图片

    • 将验证码图片写入响应输出流,供前端显示。

  4. 异常处理

    • 捕获并打印 IOException,确保生成失败时不影响程序运行。


2. 验证码校验流程 (/check)

  1. 参数检查

    • 检查用户输入的验证码是否为空,若空则直接返回 false

  2. Session 验证

    • 从 Session 中获取存储的验证码文本 (code) 和生成时间 (date)。

  3. 校验逻辑

    • 验证码正确性:忽略大小写比较用户输入与 Session 中的验证码。

    • 时效性检查:验证码需在有效期内(30 分钟内)。

  4. 返回结果

    • 若验证码正确且未过期,返回 true;否则返回 false


3. 关键设计点

  • Session 存储:验证码文本和生成时间通过 Session 共享,确保安全性和状态管理。

  • 时效控制:通过 VALID_TIME(30 分钟)限制验证码有效期,增强安全性。

  • 工具库集成:利用 Hutool 的 CaptchaUtil 快速生成图形验证码,简化开发。

package captcha.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaPropertities {
    private Integer width;
    private Integer Height;
    private Session session;

    @Data
    public static class Session{
        private String key;
        private String date;
    }
}

1. 核心作用

这是一个基于Spring Boot的配置属性绑定类,主要功能是:

  • 集中管理验证码相关的所有配置参数

  • 实现配置与代码的分离,提高灵活性和可维护性


2. 关键设计

  1. 配置绑定

    • 使用@ConfigurationProperties注解绑定配置文件中的属性

    • prefix="captcha"表示所有配置以captcha为前缀

  2. 配置分组

    • 主配置项:验证码图片的widthHeight

    • 嵌套配置:通过内部类Session管理session相关的配置项

  3. 自动配置

    • @Configuration使该类成为Spring配置类

    • @Data自动生成getter/setter等方法

2.4.4.2前端核心实现
<script>

    $("#Img").click(function () {
      $(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
    });

    $("#checkCaptcha").click(function () {
      $.ajax({
        type: "post",
        url: "/captcha/check",
        data: {
          captcha: $("#inputCaptcha").val()
        },
        success: function(result){
          if(result){
            location.href = "success.html";
          }else {
            alert("验证码错误, 请重新输入");
          }
        }
      });
    });

  </script>

1. 验证码刷新功能

实现方式

  • 通过jQuery的click事件绑定图片点击事件

  • 点击时先隐藏图片,然后修改src属性(添加时间戳防止缓存),最后淡入显示

技术要点

  • 使用new Date().getTime()添加时间戳参数,强制浏览器重新请求图片

  • hide()fadeIn()实现平滑的视觉过渡效果

2. 验证码校验功能

实现方式

  • 通过AJAX POST请求发送用户输入的验证码到服务端校验

  • 根据返回结果进行页面跳转或错误提示

技术要点

  • 使用jQuery的$.ajax方法发送异步请求

  • 成功回调中根据服务端返回的布尔值进行不同处理

  • location.href实现验证成功后的页面跳转

3. 整体交互流程

  1. 用户点击验证码图片 → 刷新验证码

  2. 用户输入验证码并点击校验按钮 → 发送AJAX请求

  3. 服务端返回校验结果 → 前端根据结果跳转或提示

4. 安全性考虑

  • 时间戳参数防止浏览器缓存验证码图片

  • POST请求方式避免验证码出现在URL中

  • 服务端校验结果决定后续操作

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,需要所有的源代码可以去我的gitee上就可以啦~你的支持就是对我最大的鼓励,大家加油!

另外最后的最后,欢迎大家加入我的社区哦,初创社区难免经验不足,请大家多多包涵,也欢迎大家前来多多交流。

爱吃烤鸡翅的酸菜鱼社区-CSDN社区云https://bbs.csdn.net/forums/aaa1f71356f6475db42ea9ea09a392bc?spm=1001.2014.3001.6682

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2383312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法优选系列(9.BFS 解决拓扑排序)

目录 拓扑排序简介&#xff1a; ​编辑 课程表&#xff08;medium&#xff09;&#xff1a; 课程表II&#xff08;medium&#xff09;: 火星词典&#xff08;hard&#xff09;&#xff1a; 拓扑排序简介&#xff1a; 有向无环图&#xff08;DAG图&#xff09; 如上图每条边…

【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?

一、全链路超时建模:从用户需求到系统分解 1.1 端到端时间预算分配 黄金公式: 用户期望响应时间 = 网络传输时间 + 服务处理时间 + 下游调用时间 + 缓冲时间典型分配策略(以1秒目标为例): 环节时间预算优化目标客户端渲染100ms骨架屏(Skeleton)预渲染边缘节点(CDN)…

力扣周赛置换环的应用,最少交换次数

置换环的基本概念 置换环是排列组合中的一个概念&#xff0c;用于描述数组元素的重排过程。当我们需要将一个数组转换为另一个数组时&#xff0c;可以把这个转换过程分解为若干个 “环”。每个环代表一组元素的循环交换路径。 举个简单例子 假设原数组 A [3, 2, 1, 4]&…

大语言模型 12 - 从0开始训练GPT 0.25B参数量 MiniMind2 补充 训练开销 训练步骤 知识蒸馏 LoRA等

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…

SQLMesh 宏操作符详解:@IF 的条件逻辑与高级应用

SQLMesh 的 IF 宏提供了一种在 SQL 查询中嵌入条件逻辑的方法&#xff0c;允许根据运行时条件动态调整查询结构。本文深入探讨 IF 的语法、使用场景及实际案例&#xff0c;帮助开发者构建更灵活、可维护的 SQL 工作流。 1. IF 宏简介 IF 是 SQLMesh 提供的条件逻辑宏&#xff…

【爬虫】12306自动化购票

上文&#xff1a; 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票&#xff0c;只写到预定票&#xff0c;没有写完登陆&#xff0c; 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单&#xff0c;复制粘贴&#xff1a; 还有很多写法&#xff1a; 官网地址&#…

【Django系统】Python+Django携程酒店评论情感分析系统

Python Django携程酒店评论情感分析系统 项目概述 这是一个基于 Django 框架开发的酒店评论情感分析系统。系统使用机器学习技术对酒店评论进行情感分析&#xff0c;帮助酒店管理者了解客户反馈&#xff0c;提升服务质量。 主要功能 评论数据导入&#xff1a;支持导入酒店…

spring cloud alibaba-Geteway详解

spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中&#xff0c;Gateway 是一个非常重要的组件&#xff0c;用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化&#xff0c;提供了更强大的功能和更好的性能。 Gat…

c#中添加visionpro控件(联合编程)

vs添加vp控件 创建窗体应用 右键选择项 点击确定 加载CogAcqfifoTool工具拍照 设置参数保存.vpp 保存为QuickBuild或者job, ToolBlock 加载保存的acq工具 实例化相机工具类 //引入命名空间 using Cognex.VisionPro; //实例化一个相机工具类 CogAcqFifoTool cogAcqFifoTool n…

性能测试-mysql监控

mysql常用监控指标 慢查询sql 慢查询&#xff1a;指执行速度低于设置的阀值的sql语句 作用&#xff1a;帮助定位查询速度较慢的sql语句&#xff0c;方便更好的优化数据库系统的性能 开启mysql慢查询日志 参数说明&#xff1a; slow_query_log:慢查询日志开启状态【on&#xf…

游戏引擎学习第301天:使用精灵边界进行排序

回顾并为今天的内容做准备 昨天&#xff0c;我们解决了一些关于排序的问题&#xff0c;这对我们清理长期存在的Z轴排序问题很有帮助。这个问题我们一直想在开始常规游戏代码之前解决。虽然不确定是否完全解决了问题&#xff0c;但我们提出了一个看起来合理的排序标准。 有两点…

【AI生成PPT】使用ChatGPT+Overleaf自动生成学术论文PPT演示文稿

【AI生成PPT】使用ChatGPTOverleaf自动生成学术论文PPT演示文稿 文章摘要&#xff1a;使用ChatGPTBeamer自动生成学术论文PPT演示文稿​​Beamer​​是什么Overleaf编辑工具ChatGPT生成Beamer Latex代码论文获取prompt设计 生成结果 文章摘要&#xff1a; 本文介绍了一种高效利…

局部放大maya的视图HUD文字大小的方法

一、问题描述&#xff1a; 有网友问&#xff1a;有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗&#xff1f; 在 Maya 中&#xff0c;可以通过自定义 HUD&#xff08;Heads-Up Display&#xff09;元素的字体大小来局部放大特…

初识Linux · NAT 内网穿透 内网打洞 代理

目录 前言&#xff1a; 内网穿透和打洞 NAPT表 内网穿透 内网打洞 正向/反向代理 前言&#xff1a; 本文算是网络原理的最后一点补充&#xff0c;为什么说是补充呢&#xff0c;因为我们在前面第一次介绍NAT的时候详细介绍的是报文从子网到公网&#xff0c;却没有介绍报文…

STM32接收红外遥控器的遥控信号

经过几天早晨的学习&#xff0c;终于把遥控器的红外信号给搞通了&#xff0c;特此记录一下&#xff1b;其实说白了&#xff0c;红外遥控就是高低电平的信号&#xff0c;用时间来区分是二进制的0还是1&#xff1b;然后把这些0或1&#xff0c;在组装成一个32位的数基本就算是完事…

Redis从入门到实战 - 高级篇(下)

一、Redis键值设计 1. 优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如&#xff1a;我们的登录业务&#xff0c;保存用户信息&…

GUI实验

题目&#xff1a; 编程包含一个标签和一个按钮&#xff0c;单击按钮时&#xff0c;标签的内容在"你好"和"再见"之间切换。 分析&#xff1a; 导入所需的Java库&#xff1a;程序使用了 javax.swing 包中的一些类来创建图形用户界面。 创建一个 JFrame 对象…

量子计算 | 量子密码学的挑战和机遇

量子计算在密码学中的应用现主要体现在对现有加密算法的威胁上。最著名的例子是Shor算法&#xff0c;该算法能够在多项式时间内分解大整数&#xff0c;从而威胁到基于大数分解的加密算法&#xff0c;如RSA加密。此外&#xff0c;量子计算还可以加速某些类型的密码分析&#xff…

分享一些多模态文档解析思路

多模态文档解析思路小记 作者&#xff1a;Arlene 原文&#xff1a;https://zhuanlan.zhihu.com/p/1905635679293122466 多模态文档解析内容涉及&#xff1a;文本、表格和图片 解析思路v1 基于mineru框架对pdf文件进行初解析 其具备较完整的布局识别和内容识别&#xff0c;并将…

AI知识梳理——RAG、Agent、ReAct、LangChain、LangGraph、MCP、Function Calling、JSON-RPC

AI技术I AI技术II RAG &#x1f4cc; 高度凝练表达 RAG &#xff08;检索增强生成&#xff09;是一种结合信息检索与生成式人工智能的技术框架&#xff0c;旨在提升大型语言模型&#xff08;LLM&#xff09;的输出准确性和实用性。通过在生成响应前引入外部知识库的信息&#…