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

YML学习

讲解YML使用场景、语法和解析

  • 1.基础知识
    • 1.1 什么是YML
    • 1.2 YML优点
    • 1.3 YML使用场景
  • 2.YML语法
    • 2.1 基础语法
    • 2.2 字面量数据类型
      • 2.2.1 字符串
      • 2.2.2 NULL
      • 2.4.5 时间戳(timestamp)
    • 2.3 对象\MAP类型
    • 2.4 数组/List/Set
      • 2.4.1 值为基础类型
      • 2.4.2 值为对象
      • 2.4.3 多维数组
      • 2.4.4 复杂类型
    • 2.5 显示类型
    • 2.6 引用和复用
  • 3.YML解析
    • 3.1准备工作
    • 3.1 spring解析
      • 3.1.1 Environment注解
      • 3.1.2 YamlPropertiesFactoryBean
    • 3.2 SnakeYml组件
      • 3.2.1 pom依赖
      • 3.2.2 解析yml文件到map
      • 3.2.3 解析yml到vo对象
      • 3.2.4 vo生成yml格式字符串
    • 3.3 jackson组件
      • 3.3.1 pom依赖
      • 3.3.2 解析yml文件到map
      • 3.3.3 解析yml到vo对象
  • 4.总结
    • 4.1 XML、JSON、YAML
    • 4.2 易错点

1.基础知识

1.1 什么是YML

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。

YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。

1.2 YML优点

  • YAML是一种非常简单的基于文本的人类可读的语言,用于在人和计算机之间交换数据。
  • YAML是不是一种编程语言。它主要用于存储配置信息。
  • YAML 的缩进就像 Python 的缩进一样优雅。
  • YAML 还减少了 JSON 和 XML 文件中的大部分“噪音”格式,例如引号、方括号和大括号

1.3 YML使用场景

yml主要用于软件配置,大有替代properties、XML、JSON的趋势,主要其格式简洁易懂

2.YML语法

2.1 基础语法

先看yml示例:

person:name: 蒋增奎gender: 男spring:profiles: devdatasource:url: jdbc:mysql://127.0.01/banchengbang_springbootusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver

对比json

spring:{profiles:"dev",datasource:{url:"jdbc:mysql://127.0.01/banchengbang_springboot",username:"root",password:"root",driver-class-name:"com.mysql.jdbc.Driver"}
}

对比java,和java对象之间的关系更接近

private String profiles;
private Datasource datasource;
  • 使用缩进表示层级关系。 | json使用花括号{}
  • 缩进时不允许使用 Tab 键,只允许使用空格。
  • 缩进的空格数不重要,但同级元素必须左侧对齐。
  • 大小写敏感
  • key:value键值对模式 |和json一样
  • 内容如字符串,不需要加""

与json区别

  • 大小写敏感 (json 里也是大小写敏感的)
  • 使用缩进表示层级关系 (json 中使用 {} 表示层级)
  • "#"表示注释 (json 不允许写注释, yaml 写的配置文件要比 json 方便很多)
  • key : val 值之前必须有空格
  • 多个key-val组合,不需要加逗号","

总结:比json少{},逗号,多缩进和值前空格

YAML 支持以下三种数据结构:

  • 对象:键值对的集合
  • 数组:一组按次序排列的值
  • 字面量:单个的、不可拆分的值

2.2 字面量数据类型

  1. 字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。
  2. 在 YAML 中,使用“key:[空格]value”的形式表示一对键值对(空格不能省略), 如 url:
    www.biancheng.net。
  3. 字面量直接写在键值对的“value”中即可,且默认情况下字符串是不需要使用单引号或双引号的。

示例:

name: 蒋增奎  #姓名
isMan: true  # 男士
birth: 2023-12-01  #出身日期
weight: 80.5
height: 172
parent: ~   # ~ 表示null

2.2.1 字符串

字符串可以加单引号或双引号或者没有引号。

quoted: - 'single quoted string'- "double quoted strings"- withoout quoted string

都是合法的,等价于json

{"quoted": ["single quoted string","double quoted strings","withoout quoted string"]
}

多行文本
字符串比较多的时候,更好的展示,选择单行/多行文本展示,用| 前缀。
例如,配置 GitHub Actions 时候运行一些命令:

# Multiline strings start with |
execute: |npm cinpm buildnpm test

等价json

{"execute": "npm ci\nnpm build\nnpm test\n"
}

2.2.2 NULL

YAML 声明空值有以下几种方法:

manager: null
blank:
tilde: ~
title: null
~: null key

等同json

{"manager": null,"blank": null,"tilde": null,"title": null,"null": "null key"
}

2.4.5 时间戳(timestamp)

时间戳表示单个时间点。它使用符号形式 ISO8601。如果未添加时区,则假定该时区为 UTC。要描述日期格式,可以省略时间部分。在这种情况下,时间默认为00:00:00Z。请参见下面示例中的用法。

time: 2020-12-07T01:02:59:34.02Z
timestamp: 2020-12-07T01:02:59:34.02 +05:30
datetime: 2020-12-07T01:02:59:34.02+05:30
notimezone: 2020-12-07T01:02:59:34.02
date: 2020-12-07

但实际转化有点问题

2.3 对象\MAP类型

使用缩进表示对象与属性的层级关系。
写法1:推荐

key1: value1
key2: value2

写法2:不推荐,除非比较深的嵌套。感觉有点像json数据

key: {key1: value1, key2: value2, …}

website: name: baiduurl: www.baidu.com

或者

website: {name: baidu,url: www.baidu.com}

2.4 数组/List/Set

2.4.1 值为基础类型

写法1:推荐
YAML 使用“-”表示数组中的元素,注意:- 后面也要加空格

pets:- cat- dog- pig

写法2:这种也推荐,比较简化
用[]表示 key: [value1,value2]

pets: [cat,dog,pig]

2.4.2 值为对象

如果值一个对象如:

# java 代码:
private List<Dog> lists;#yml数据
lists:- name: 可乐age: 2   #注意前面没有 -- name: 卷毛age: 3
或者:
lists: - {name: 可乐,age: 2}- {name: 卷毛,age: 3}
或者:
lists: [{name: 可乐,age: 2},{name: 卷毛,age: 3}]

2.4.3 多维数组

-- A- B- C
-- D- E- F
结果:[["A", "B", "C"],["D", "E", "F"]] 

2.4.4 复杂类型

有对象,有数组、基本数据类型

  name: zhangsanage: 30pets:-dog-cat-pigcar:name: QQchild:name: zhangxiaosanage: 2

java代码

public class Person {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Dog> lists;private Dog dog;private String[] arr;
}
public class Dog {private String name;private Integer age;
}

对应的yml填充数据

person:boss: falsemaps:k1: v1k2: 14lists:- name: d1age: 2- name: d2age: 3- {name: d3,age: 4}birth: 2017/12/15dog:name: p_dogage: 15age: 13last-name: 张三arr: [s1,s2,s3]

2.5 显示类型

默认情况下,YAML 会自动推断数据类型,就像 TypeScript 的类型推断一样,但是当你需要你也可以使用 标签(tags)显示指定类型,比如整数类型 两个英文感叹号 !! 再加上 int 就变成了一个整数 tag ——!!int。

# The following value should be an int, no matter what:
should-be-int: !!int 3.2# Parse any value to string:
should-be-string: !!str 30.25# I need the next value to be boolean:
should-be-boolean: !!bool yes!!com.jsoft.po.Company
address: 天府大道
boss: {birth: !!date '2023-12-13', id: 1, name: 蒋增奎, weight: 78.78}
creat_date: 2000-12-31
id: 1
name: 雪州科技
users:- {birth: !!timestamp'2023-12-13T01:10:32.464Z', id: 2, name: 张三丰, weight: !!float '89'}- {birth: !!timestamp '2023-12-13T01:10:32.464Z', id: 3, name: 张无忌, weight: !!float '100'}

2.6 引用和复用

YML值相互引用的基本语法如下:
key:&anchor
value other_key:anchor
在上面的例子中,key是一个YML键,&anchor是一个锚点,value是一个值。
通过在其他地方使用
anchor来引用这个值。

database:host: &db_host localhost   #给key[host]取一个别名prot: &db_port 3306username: &db_username rootpwd: &db_pwd 11111development:database:host: *db_host  # *别名,引用别名对应的值 这里就是localhost   prot: *db_portusername: *db_usernamepwd: *db_pwd

实际效果如下

development:database:host: localhostprot: 3306username: rootpwd: 11111development:database:host: localhostprot: 3306username: rootpwd: 11111

复用大节点

basic: &common   #这个basic节点时可复用的sex: 男city: 女user:name: 蒋增奎<<: *common

等价于

basic: &common   #这个basic节点时可复用的sex: 男city: 女user:name: 蒋增奎sex: 男city:

& 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。注意只是复用这个节点的数据,这个节点不会复用过来

3.YML解析

3.1准备工作

准备两个vo类

public class Company {private Long id;private String name;private String address;private User boss;private List<User> users;.......
}
public class User {private Long id;private String name;private Date birth;private BigDecimal weight;
...
}

3.1 spring解析

3.1.1 Environment注解

在Spring中有一个类Environment,它可以被认为是当前应用程序正在运行的环境,它继承了PropertyResolver接口,因此可以作为一个属性解析器使用。先创建一个yml文件,属性如下:

person:name: hydragender: maleage: 18

使用起来也非常简单,直接使用@Autowired就可以注入到要使用的类中,然后调用它的getProperty()方法就可以根据属性名称取出对应的值了。

@RestController
public class EnvironmentController {@Autowiredprivate Environment environment;  //注入@GetMapping("envTest")private void getEnv(){System.out.println(environment.getProperty("person.name"));  //通过key获取System.out.println(environment.getProperty("person.gender"));Integer autoClose = environment.getProperty("person.age", Integer.class);  //类型转化System.out.println(autoClose);String defaultValue = environment.getProperty("person.other", String.class, "defaultValue");//类型转化System.out.println(defaultValue);}
}

3.1.2 YamlPropertiesFactoryBean

在Spring中还可以使用YamlPropertiesFactoryBean来读取自定义配置的yml文件,而不用再被拘束于application.yml及其激活的其他配置文件。

在使用过程中,只需要通过setResources()方法设置自定义yml配置文件的存储路径,再通过getObject()方法获取Properties对象,后续就可以通过它获取具体的属性,下面看一个例子:

@GetMapping("fcTest")
public void ymlProFctest(){YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();yamlProFb.setResources(new ClassPathResource("application2.yml"));Properties properties = yamlProFb.getObject();System.out.println(properties.get("person2.name"));System.out.println(properties.get("person2.gender"));System.out.println(properties.toString());
}

3.2 SnakeYml组件

前面介绍的几种方式,在Spring环境下无需引入其他依赖就可以完成的,接下来要介绍的SnakeYml在使用前需要引入依赖,但是同时也可以脱离Spring环境单独使用。先引入依赖坐标:

3.2.1 pom依赖

<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.30</version>
</dependency>

3.2.2 解析yml文件到map

test.yml

id: 10
title: 钢铁是怎么炼成的
price: 35
author:firstName: 蒋lastName: 增奎tel: 13688006645

解析:
Yaml yaml=new Yaml();
1.返回的是一个map对象:map<key,value>
Map<String, Object> map=yaml).load(inputStream);
2.返回的是一个VO对象
VO vo=yaml).load(inputStream,VO.class);

    @Testpublic void t2() {Yaml yaml=new Yaml();Map<String, Object> map =yaml.load(getClass().getClassLoader().getResourceAsStream("test.yml"));//System.out.println(map);for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());}//获得基础类型String title=(String)map.get("title");System.out.println("title->"+title+";id->"+map.get("id")+";price->"+map.get("price"));//获得对象Map<String, Object> author =(Map)map.get("author");//获得对象的子属性String lastName=(String) author.get("lastName");System.out.println("lastName="+lastName);}

效果

key = id, value = 10
key = title, value = 钢铁是怎么炼成的
key = price, value = 35
key = author, value = {firstName=, lastName=增奎, tel=13688006645}
title->钢铁是怎么炼成的;id->10;price->35
lastName=增奎

3.2.3 解析yml到vo对象

把上一个步骤生成字符串,保存到company.yml文件,放置到类的根目录下
代码:

@Testpublic void t2(){Yaml yaml=new Yaml();Company Company =yaml.loadAs(getClass().getClassLoader().getResourceAsStream("company.yml"), Company.class);System.out.println(Company.toString());}

效果

Company{
id=1, name='雪州科技', address='天府大道', boss=User{id=1, 
name='蒋增奎', birth=Tue Dec 12 22:32:36 CST 2023, weight=78.78}, 
users=[User{id=2, name='张三丰', birth=Tue Dec 12 22:32:36 CST 2023, weight=89},User{id=3, name='张无忌', birth=Tue Dec 12 22:32:36 CST 2023, weight=100}]}

3.2.4 vo生成yml格式字符串

public class TestDemo {/*** vo生成yml格式字符串*/@Testpublic void t1() {Company company=getGS();Yaml yaml = new Yaml();StringWriter sw = new StringWriter();yaml.dump(company, sw);System.out.println(sw.toString());}public Company getGS(){Company gs=new Company();gs.setAddress("天府大道");gs.setBoss(new User(1l,"蒋增奎",new Date(), new BigDecimal("78.78")));gs.setId(1l);gs.setName("雪州科技");List<User> users=new ArrayList<>();users.add(new User(2l,"张三丰",new Date(), new BigDecimal("89")));users.add(new User(3l,"张无忌",new Date(), new BigDecimal("100")));gs.setUsers(users);return gs;}
}

执行效果:

!!com.jsoft.po.Company
address: 天府大道
boss: {birth: !!timestamp '2023-12-12T23:37:08.209Z', id: 1, name: 蒋增奎, weight: 78.78}
id: 1
name: 雪州科技
users:
- {birth: !!timestamp '2023-12-12T23:37:08.211Z', id: 2, name: 张三丰, weight: !!float '89'}
- {birth: !!timestamp '2023-12-12T23:37:08.211Z', id: 3, name: 张无忌, weight: !!float '100'}

3.3 jackson组件

jackson不仅可以解析json,也支持yml

3.3.1 pom依赖

 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.12.3</version></dependency>

3.3.2 解析yml文件到map

test.yml

id: 10
title: 钢铁是怎么炼成的
price: 35
author:firstName: 蒋lastName: 增奎tel: 13688006645

java代码

    @Testpublic void t4() throws IOException {ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());InputStream input=this.getClass().getClassLoader().getResourceAsStream("test.yml");Map<String,Object> map = objectMapper.readValue(input, Map.class);for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());}//获得基础类型String title=(String)map.get("title");System.out.println("title->"+title+";id->"+map.get("id")+";price->"+map.get("price"));//获得对象Map<String, Object> author =(Map)map.get("author");//获得对象的子属性String lastName=(String) author.get("lastName");System.out.println("lastName="+lastName);}

效果

key = id, value = 10
key = title, value = 钢铁是怎么炼成的
key = price, value = 35
key = author, value = {firstName=, lastName=增奎, tel=13688006645}
title->钢铁是怎么炼成的;id->10;price->35
lastName=增奎

3.3.3 解析yml到vo对象

把上一个步骤生成字符串,保存到company.yml文件,放置到类的根目录下
代码:

@Testpublic void t5() throws IOException {ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());InputStream input=this.getClass().getClassLoader().getResourceAsStream("company.yml");Company Company = objectMapper.readValue(input, Company.class);System.out.println(Company.toString());}

效果

Company{
id=1, name='雪州科技', address='天府大道', boss=User{id=1, 
name='蒋增奎', birth=Tue Dec 12 22:32:36 CST 2023, weight=78.78}, 
users=[User{id=2, name='张三丰', birth=Tue Dec 12 22:32:36 CST 2023, weight=89},User{id=3, name='张无忌', birth=Tue Dec 12 22:32:36 CST 2023, weight=100}]}

4.总结

4.1 XML、JSON、YAML

看下图,从左往右是 XML、JSON、YAML 文件,JSON 通过 {} 和 [] 等简化了 XML,变得更加直观,但是当嵌套过深 XML 需要找结尾标签,JSON 需要找结尾的 },无论 XML 还是 JSON 都需要找结尾标记,很不直观,但 YAML 直接做的比 JSON 更加激进,连符号都没了,立体结构也变得扁平了,更加符合人类阅读习惯。

4.2 易错点

Java

public class Person {private String name;private String tel;//-----}

对应yml

name : jzk
tel : 13688006635

错误:

person:name : jzktel : 13688006635

不要因为缩进把java类名也写入,和json一样,yml只和对象的属性值有关,和类无关

相关文章:

YML学习

讲解YML使用场景、语法和解析 1.基础知识1.1 什么是YML1.2 YML优点1.3 YML使用场景 2.YML语法2.1 基础语法2.2 字面量数据类型2.2.1 字符串2.2.2 NULL2.4.5 时间戳&#xff08;timestamp&#xff09; 2.3 对象\MAP类型2.4 数组/List/Set2.4.1 值为基础类型2.4.2 值为对象2.4.3 …...

华为HCIP认证H12-821题库下

26、6.交换技术核心知识 &#xff08;单选题&#xff09;某交换机运行RSTP协议&#xff0c;其相关配置信息如图所示,请根据命令配置情况指出对于Instance 1&#xff0c;该交换机的角色是: A、根交换机 B、非根交换机 C、交换机 D、无法判断 正确答案是&…...

01--二分查找

一. 初识算法 1.1 什么是算法&#xff1f; 在数学和计算机科学领域&#xff0c;算法是一系列有限的严谨指令&#xff0c;通常用于解决一类特定问题或执行计算 不正式的说&#xff0c;算法就是任何定义优良的计算过程&#xff1a;接收一些值作为输入&#xff0c;在有限的时间…...

初识大数据应用,一文掌握大数据知识文集(1)

文章目录 &#x1f3c6;初识大数据应用知识&#x1f50e;一、初识大数据应用知识(1)&#x1f341; 01、请用Java实现非递归二分查询&#xff1f;&#x1f341; 02、是客户端还是Namenode决定输入的分片&#xff1f;&#x1f341; 03、mapred.job.tracker命令的作用&#xff1f;…...

Kafka生产问题总结及性能优化实践

1、消息丢失情况 消息发送端&#xff1a; &#xff08;1&#xff09;acks0&#xff1a; 表示producer不需要等待任何broker确认收到消息的回复&#xff0c;就可以继续发送下一条消息。性能最高&#xff0c;但是最容易丢消息。大数据统计报表场景&#xff0c;对性能要求很高&am…...

[MySQL]数据库原理2,Server,DataBase,Connection,latin1、UTF-8,gb2312,Encoding,Default Collation——喵喵期末不挂科

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…...

【算法集训】基础数据结构:十、矩阵

矩阵其实就是二维数组&#xff0c;这些题目在9日集训中已经做过&#xff0c;这里做的方法大致相同。 第一题 1351. 统计有序矩阵中的负数 int countNegatives(int** grid, int gridSize, int* gridColSize) {int r gridSize;int c gridColSize[0];int ret 0;for(int i 0;…...

python排序算法 直接插入排序法和折半插入排序法

最近需要使用到一些排序算法&#xff0c;今天主要使针对直接插入排序和折半插入排序进行讲解。 首先是直接插入排序&#xff0c;其排序过程主要是&#xff0c;针对A[a1,a2,a3,a4,a5....an]&#xff0c;从排序的序列头部起始位置开始&#xff0c;将其也就是a1视为只有一个元素的…...

【flutter对抗】blutter使用+ACTF习题

最新的能很好反编译flutter程序的项目 1、安装 git clone https://github.com/worawit/blutter --depth1 然后我直接将对应的两个压缩包下载下来&#xff08;通过浏览器手动下载&#xff09; 不再通过python的代码来下载&#xff0c;之前一直卡在这个地方。 如果读者可以正…...

OpenHarmony 如何去除系统锁屏应用

前言 OpenHarmony源码版本&#xff1a;4.0release / 3.2 release 开发板&#xff1a;DAYU / rk3568 一、3.2版本去除锁屏应用 在源码根目录下&#xff1a;productdefine/common/inherit/rich.json 中删除screenlock_mgr组件的编译配置&#xff0c;在rich.json文件中搜索th…...

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…...

C#基础——构造函数、析构函数

C#基础——构造函数、析构函数 1、构造函数 构造函数是一种特殊的方法&#xff0c;用于在创建类的实例时进行初始化操作。构造函数与类同名&#xff0c;并且没有返回类型。 构造函数在对象创建时自动调用&#xff0c;可以用来设置对象的初始状态、分配内存、初始化字段等操作…...

jmeter 如何循环使用接口返回的多值?

有同学在用jmeter做接口测试的时候&#xff0c;经常会遇到这样一种情况&#xff1a; 就是一个接口请求返回了多个值&#xff0c;然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢&#xff1f; 有一定基础的人&#xff0c;可能第一反应就是先提取前一个接口返回…...

VLAN 详解一(VLAN 基本原理及 VLAN 划分原则)

VLAN 详解一&#xff08;VLAN 基本原理及 VLAN 划分原则&#xff09; 在早期的交换网络中&#xff0c;网络中只有 PC、终端和交换机&#xff0c;当某台主机发送一个广播帧或未知单播帧时&#xff0c;该数据帧会被泛洪&#xff0c;甚至传递到整个广播域。而广播域越大&#xff…...

Android - 分区存储 MediaStore、SAF

官方页面 参考文章 一、概念 分区存储&#xff08;Scoped Storage&#xff09;的推出是针对 APP 访问外部存储的行为&#xff08;乱建乱获取文件和文件夹&#xff09;进行规范和限制&#xff0c;以减少混乱使得用户能更好的控制自己的文件。 公有目录被分为两大类&#xff1a;…...

Shiro框架权限控制

首先去通过配置类的用户认证&#xff0c;在用户认证完成后&#xff0c;进行用户授权&#xff0c;用户通过授权之后再跳转其他的界面时&#xff0c;会进行一个验证&#xff0c;当前账号是否有权限。 前端权限控制显示的原理 在前端中&#xff0c;通常使用用户的角色或权限信息来…...

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置&#xff1a;https://tailscale.com/download/linux #具体命令为&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后&#xff0c;您可以启动…...

spring 项目中如何处理跨越cors问题

1.使用 CrossOrigin 注解 作用于controller 方法上 示例如下 RestController RequestMapping("/account") public class AccountController {CrossOriginGetMapping("/{id}")public Account retrieve(PathVariable Long id) {// ...}DeleteMapping(&quo…...

importlib --- import 的实现

3.1 新版功能. 源代码 Lib/importlib/__init__.py 概述 importlib 包具有三重目标。 一是在 Python 源代码中提供 import 语句的实现&#xff08;并且因此而扩展 __import__() 函数&#xff09;。 这提供了一个可移植到任何 Python 解释器的 import 实现。 与使用 Python 以…...

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络&#xff08;VGG&#xff09;1.3. 网络中的网络&#xff08;NiN&#xff09;1.4. 含并行连结的网络&#xff08;GoogLeNet&#xff09;1.5. 批量规范化…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...