前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >天天在用YML配置SpringBoot,这些骚操作你了解了么?

天天在用YML配置SpringBoot,这些骚操作你了解了么?

作者头像
macrozheng
发布于 2021-07-02 14:11:58
发布于 2021-07-02 14:11:58
1.4K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

我非常羞耻的发现,配置文件界,已经被下面三种所统治:yamltomljson,这让一直使用properties文件的javaer深深的埋下了头。

不要担心,当你读到文章最后,你也会羞愧的埋下头。也可能会有一丝愤怒。

像各种人工智能调参数,k8s调参师,都已经成功升级为yml配置大师。作为一个常年使用yml文件的SpringBoot框架使用者,有时候对yml的表现形式竟然显露出了困惑,这不由得让人羞愧又加了一层。

YAML,竟然是XML的一个子集,所以它的复杂是有源头的,最早诞生于2009年。

使用yml文件,首先遇到的问题,就是它的缩进问题。就如同python语言一样,yml文件的表现层次,是靠嵌套的缩进来完成的。它并不使用TAB,而是使用空格表示缩进。

要命的是,空格的多少,并不重要,只要相同级别元素左侧能够对齐就行。这对于CV党来说,不得不说是一个噩梦哈哈。

那一个配置文件,要解决哪些问题呢?Redis已经做出了回答。就像你学习一门新的语言一样,解决了它的字符串和集合的表示方法,基本上写代码就没问题了。那我们就挨个来看一下。

以下方法以SpringBoot的yml文件格式为准,其他场景的解析器会有些许差异。为了能够debug这些值,我们简单的写了一个测试类,然后再设值完成之后打印以下就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableAutoConfiguration
@Configuration
public class TestConfig implements InitializingBean {
    @Value("${str1}")
    String str1;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(this);
    }
}

1. 字符串

字符串是最简单的配置,也是最常见的配置。再spring中,字符串可以代引号,也可以不带引号。所以下面三行的配置效果,是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1: ksdfjsdlkfjdsf skdfljs
str1: 'ksdfjsdlkfjdsf skdfljs'
str1: "ksdfjsdlkfjdsf skdfljs"

那么,如何支持多行文本呢?毕竟有些需求,就是这么作死。写法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1: |
  ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs

注意,后面不需要有其他的画蛇添足的结束表示,一切都是靠缩进来证明的。当然,你也可以把 |换成>,效果是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1: >
  ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs

要命的是,它还有第三种写法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1: "ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs
  ksdfjsdlkfjdsf skdfljs"

2. 数字

当我们的接收者,是一个数字的时候,比如下面这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value("${a}")
int a ;

那么,你即使把配置文件写成了字符串,它也会强制转成数字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a: "014"

此时,a的数值,就会被设置成整数14。

神奇的是,如果你把引号去掉,也就是下面这样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a: 014

此时,a的数值,竟然变成了12!

我就曾碰到过这样的极品bug,浪费了不少脑细胞,wtf。因为以0开头,代表的是八进制,解析器中间做了一层转换。所以,按照这个逻辑,0x14就是20,使用时一定要注意这一点。机灵的同学可以拿来埋坑哦。

这里也有一些特殊的写法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float: 1.23e+3     # 浮点数
fixed: 13.67       # 固定小数
minmin: -.inf      # 表示负无穷
notNumber: .NaN    # 无效数字

boolean: [true, false] # 布尔值
string: '12345'    # 字符串

date: 2021-06-03   # 日期

3. 字典

再来看一下常见的字典。其实,把所有的配置罗列开来,本身就是一个字典,也就是kv配置。

它是以:进行分割的,所以左半部分要求不能有特殊字符,否则就晕菜了。不不不,它没有晕菜,因为它把乱七八糟的字符,正确的识别了出来。比如下面的yml配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a&& xk@71: 0x14

这样的代码接收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value("${a&& xk@71}")
int a ;

嗯,容易被打死的写法。所以,你懂的。

还是我太幼稚了,yml文件根本就没规定key不允许有特殊字符,它允许你这么做。

4. 对象

由字典,很容易可以扩展到对象。因为对象,也是一堆属性的集合。json已经证明,这些属性,就是一堆KV,我们的yaml也是如此。

假设有如下的代码,我们需要构造dog中的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public static class Dog{
    private String xjjdog1;
    private String xjjdog2;
}

@Bean
@ConfigurationProperties(prefix = "dog")
public Dog getDog(){
    return new Dog();
}

第一种yml的写法,是这样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dog:
  xjjdog1: i am xjjdog1
  xjjdog2: i am xjjdog1++

而另一种方式,是把json数据直接给写到文件里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dog: {xjjdog1: 'i am xjjdog1',xjjdog2: 'i am xjjdog++'}

当然,多个层次,可以在一行之中平铺开。比如prefix是super.dog,那么yml文件就可以这么写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
super.dog: {xjjdog1: 'i am xjjdog1',xjjdog2: 'i am xjjdog++'}

5. 列表支持

列表,就是list,我们可以使用数组接收,也可以使用List等。

它也有两种写法。这是最常见的一种。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animal:
  - dog
  - cat
  - monkey

当然,也可以放在一行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animal: [dog,cat,monkey]

这没什么问题,关键是yml文件支持嵌套。比如List里嵌套Map,或者Map里嵌套List。当嵌套层次比较深的时候,或者缩进没什么规律的时候,就显得非常的乱。

比如下面这个k8s的pod配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  name: xjjdog-Pod
  labels:
    app: front-web
spec:
  containers:
    - name: front-web
      image: nginx
      ports:
        - containerPort: 80
    - name: front-app
      image: xjjdog/frontapp
      ports:
        - containerPort: 14000
  storages:
  ...

比较复杂的是spec,里面有containersstorages等配置。其中containers是一个列表,列表之间是一个map,map中其中的ports属性,又是一个列表...如此嵌套,如果配置文件比较长的化,不熟悉业务属性的同学就会容易晕菜。

6. 特殊数据

即使是这样,yaml也比xml简单的多。它也有很多特殊的写法。

比如这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1: !!str 2021-06-03

它的意思是,把2021-06-04,强制转化成字符串。这样的强制转化有很多,但大多数时候你不会用。但如果你想要把你的yaml文件变得复杂,让别人不敢动,那就可以这么做。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 !!int               # 整数类型
 !!float             # 浮点类型
 !!bool              # 布尔类型
 !!str               # 字符串类型
 !!binary            # 也是字符串类型
 !!timestamp         # 日期时间类型
 !!null              # 空值
 !!set               # 集合
 !!omap, !!pairs     # 键值列表或对象列表
 !!seq               # 序列,也是列表
 !!map               # 键值表

既然yml文件有这么多复杂的写法,那么我们就可以去玩一把。比如下面的写法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from: &d !!str 2021-06-04
str1: *d

这个配置,和上面的配置,效果是一样的,&的意思是标记,我们给它起了个名字,叫做d*的意思是引用,我们在需要它的地方引用一把就可以了。

yml中的key,竟然也可以用对象或者复杂的结构作为key。为了标识是一个特殊的key,我们还要做一点处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
?[blue, reg, green]: Color

上面这个配置的?,就是说,我下面要进行一个比较复杂的配置了,你准备好了么?

7. End

学会了这些招数的你,是不是跃跃欲试了?想要在你的SpringBoot项目里搞一点有意思的东西?为了让你的基础架构部门无法扫描出你的配置,为什么不呢?

这是我改造的一个普通datasource的配置文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
h2: &sa !!str sa
driver: &driver !!str org.h2.Driver
defaults: &defaults
  ?username: *sa
  ?password:
  ?driverClassName: *driver
spring:
  datasource:
    <<: *defaults
    ?url: !!str >
      jdbc:h2:mem:h2test;
      DB_CLOSE_DELAY=-1;
      DB_CLOSE_ON_EXIT=FALSE

你觉得美么?我反正腿挺疼的。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
写yml,写的腿疼。
我非常羞耻的发现,配置文件界,已经被下面三种所统治:yaml,toml和json,这让一直使用properties文件的javaer深深的埋下了头。
xjjdog
2021/07/07
7210
写yml,写的腿疼。
重学SpringBoot3-yaml文件配置
YAML(YAML Ain't Markup Language)是一种常用于配置文件的数据序列化格式,因其易于阅读和书写而广受欢迎。在 Spring Boot 应用中,YAML 文件通常用于替代传统的 properties 文件,用于配置应用的各种参数。本教程将引导你了解 YAML 文件的基本写法和在 Spring Boot 中的应用。
CoderJia
2024/10/18
3070
重学SpringBoot3-yaml文件配置
SpringBoot系列之YAML配置用法学习笔记
配置文件的作用:修改SpringBoot自动配置的默认值,主要是默认值,因为SpringBoot启动时会自动加载很多默认配置,详细的可以参考我之前博客源码学习系列之SpringBoot自动配置
SmileNicky
2019/11/04
7090
YAML 介绍
key: value, 在下一行来写对象的属性和值的关系;注意缩进m, 对象还是k: v的方式
为为为什么
2023/10/18
3230
SpringBoot基础(二):配置文件详解
Java微观世界
2025/01/21
2160
SpringBoot基础(二):配置文件详解
第二节,Springboot自定义配置文件
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
DencyCheng
2018/11/05
6600
Python 配置文件 yaml 用法详解
YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。YAML类似于XML,但是语法比XML简单得多,对于转化成数组或可以hash的数据时是很简单有效的。
用户8949263
2022/04/08
9800
「走进k8s」Kubernetes1.15.1配置软知识yaml(16)
3.缩进时不允许使用Tab键,只允许使用空格。(可以通过编译器将tab键设置成2个空格或者4个空格)
IT架构圈
2019/08/15
1.7K0
SpringBoot中的配置文件详解(yml、properties全局配置和自定义配置、@ConfigurationProperties与@Vuale使用、有趣的banner图配置)
全局配置文件能够对一些默认配置值进行修改。Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件,该文件存放在src/main/resource目录或者类路径的/config,一般会选择resource目录。接下来,将针对这两种全局配置文件进行讲解∶
共饮一杯无
2022/11/28
13.5K0
SpringBoot中的配置文件详解(yml、properties全局配置和自定义配置、@ConfigurationProperties与@Vuale使用、有趣的banner图配置)
第二章,springboot 配置,yaml 语法[通俗易懂]
首先看上图,我们在使用spring initializer快速创建一个项目的后,会自动生成上面的资源文件夹,••••••••
全栈程序员站长
2022/08/09
3220
第二章,springboot 配置,yaml 语法[通俗易懂]
springboot配置之yaml
3、springboot默认有两种配置springboot配置的方式,一种就application.properties,另一种就是application.yml
西西嘛呦
2020/08/26
1.2K0
springboot配置之yaml
SpringBoot配置
1.配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的; application.properties application.yml 配置文件的作用:修改SpringBoot的自动配置的默认值;SpringBoot在底层都给我们自动配置好; YAML 是一个标记语言;不是一个标记语言; 标记语言:以前的配置文件;大多使用的是xxx.xml文件; YAML 以数据为中心 YAML: server: port: 8081 XML: <server> <port>8081</port>
用户1112962
2018/07/04
8040
一个 yml 文件居然能玩出这么多花样!
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强度这种语音是以数据为中心,而不是以标记语音为重心,例如像xml语言就会使用大量的标记。
Guide哥
2021/04/30
2K0
Yaml 速成查询表
若是接触过编程数据结构的,对这个上手贼快. 写过json这些的...主要关注下缩进这些,理解下概念即可! 这里只列出非常高频且通用性高的使用姿势,个别骚姿势自行去提案了解!
CRPER
2020/07/17
1.3K0
[918]python使用yaml模块
python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;
周小董
2020/12/29
2.8K0
Spring Boot之yaml配置注入基本使用
1、在springboot项目中的resources目录下新建一个文件 application.yml 2、编写一个实体类 Dog;
兮动人
2021/06/11
6K0
Spring Boot之yaml配置注入基本使用
《JavaEE进阶》----13.<Spring Boot【配置文件】>
硬编码:是将数据直接嵌入到程序或者其他可执行对象的源代码中,也就是我们常说的“代码写死”。
用户11288958
2024/09/24
1030
《JavaEE进阶》----13.<Spring Boot【配置文件】>
SpringBoot--yml/yaml配置文件
SpringBoot除了properties配置文件,还可以使用yaml配置文件,更为直观。
花猪
2022/02/17
8220
SpringBoot--yml/yaml配置文件
这可能是把SpringBoot配置文件讲解的最详细的文章了
SpringBoot使用一个全局的配置文件,配置文件名是固定的,配置文件主要分为以下两种
Java编程指南
2020/07/24
2.6K0
这可能是把SpringBoot配置文件讲解的最详细的文章了
springboot配置文件
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
兮动人
2021/06/11
3980
springboot配置文件
相关推荐
写yml,写的腿疼。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验