.yml文件_【玩转SpringBoot】配置文件yml的正确打开姿势

2023-11-16

作者:编程新说李新杰

出自:微信公众号“编程新说”

原文:【玩转SpringBoot】配置文件yml的正确打开姿势


序言

在很久以前,Spring的配置文件是基于XML的。它的名字就是applicationContext.xml,没错,就只有这一个xml文件。
它里面配置了所有的东西。但是数据库信息通常会单独拿出来,放入一个properties文件,通常叫db.properties。
后来觉着一个xml里的东西实在太多了,就按功能拆分成几个独立的xml。
spring-dao.xml是dao层,spring-service.xml是service层,spring-tx.xml是事务相关,dispatcher-servlet.xml是web相关。
这么多的xml怎么办呢?很简单,就是在applicationContext.xml里都引用它们即可。
随着JDK在1.5加入了对注解的支持,Spring也慢慢的向注解转化。直至后来一个xml都不剩,全部变为注解,连web.xml都没有了。
是xml不行了,还是注解太牛X了,其实它们是等价的,连官网上都说它们一摸一样,故而不做推荐,让用户根据实际情况自己选择。
不过,最终历史还是抛弃了XML,肯定是多方面的原因,可能如下:
1)人们厌倦了XML,出现审美疲劳
2)试用了注解很爽,一发不可收拾
3)注解代表着先进的生产力,极大提升了效率
4)XML拖沓累赘,注解清爽干脆
5)大家都觉得使用注解比使用XML更牛B。
于是乎,一个辉煌的新时代碾压了一个曾经辉煌的曾经的新时代。
呵呵,历史是什么,就是个车轮。一切皆可碾压。
总之,既有实际实践问题,又有思想意识问题,说不清,道不明。
随着SpringBoot的横空出世,配置文件的概念又发了变化。
SpringBoot强调自动配置(也叫自动装配),所以配置对它来说很重要。
配置文件属于配置的一部分,自然也变得非常重要,于是yml就应势站了起来。
yml从未像现在这样流行,成了新时代的网红。yml配置文件的格式
每种新事物的流行,总会有它比旧事物更好的地方。
作为Java界配置文件鼻祖,非properties文件莫属,它里面的格式就不用再举例了吧。
它是一维非结构化的,一行一个,写多了容易乱。
而yml文件是二维结构化的,有严格的缩进,结果就是层次分明,非常清晰。
而且,常用的配置都能得到支持,这就是它的优势,所以就流行起来了。
一、List配置格式,如下图01:

二、Map配置格式,如下图02:

三、List套List格式,如下图03:

四、List套Map格式,如下图04:

五、Map套Map格式,如下图05:

六、Map套List格式,如下图06:

虽然有些嵌套可能并不适用,这里只是说明yml支持这样的嵌套,如果愿意的话,嵌套层次还可以更深。yml配置文件内容的存储
大家都知道SpringBoot是由Spring发展而来的,Spring里是有Environment这个概念的。
所有的环境变量、系统属性、配置文件内容都会放进去。
通常的配置项都是一些key=value,就和properties文件是一样的。所以Environment底层也是这样实现的。
但到了SpringBoot中,配置文件变为yml了,是二维结构化的,根本没有办法直接用key=value这种形式表示。
但是,yml配置文件的内容还必须要放入到Environment中去。那怎么办呢?看来二者必须要修改其一了。
由于Spring已经很多年了,它里面的很多概念都已经固化下来了,包括Environment内部的结构与实现。
因此,最终选择yml去适配Environment,把二维结构化变为一维非结构化,即把有层次的变为简单的key=value形式。
这在编程里有一个专门的术语,叫扁平化。其实人员管理里面也有扁平化。
具体规则也非常简单,把父子关系用点号(.)表示,把列表索引用中括号([])表示。
把刚刚的配置内容输出来看看,如下图070809:


这样就完成了扁平化,就可以存入到Environment中去了。
等号(=)前面的就是key,后面的就是值。直接粗暴的使用yml配置文件内容
由于yml配置文件内容最终会进入Environment中,所以就等于直接粗暴的从Environment中读取值。
此时,key必须要写成上面那样子,否则取不到值。
一、直接从Environment中读取,如下图10:

结果输出如下图11:

二、使用@Value注解,如下图12:

结果输出如下图13:

这就是简单粗暴的方式,除了看上去不美观之外,还把yml的结构化特征给丢失了。
其实,还有一个比较严重的问题,就是只能获取到最终key对应的单个值,如果想获取一个List或Map作为返回值,是不行的。优雅的使用yml配置文件内容
key=value这种形式其实就是个Map,而Map其实和Java Bean差的并不多,只不过Bean中是属性名和属性值罢了。
Map套Map就等于Bean套Bean,这样无论结构形式还是语义表达都能很完美的映射过来。
且Bean是强类型的,属性名和属性类型一目了然,比Map强多了。
所以yml配置文件里的内容可以映射为Java里的Bean,这就是SpringBoot推荐的优雅的使用方式。
这里的核心问题就是,yml里的配置项要和Bean中的属性名称和类型对应好,不然会出问题。
下面请看一个示例,自己瞎编了一个游泳比赛的得分和奖品的配置。
含有一等奖、二等奖、三等奖的得分区间,和它们分别对应的奖品名称和数量。
如下图14:

可以看到scores对应的是一个列表,它有三个元素,每个元素都有level、lowBound、highBound三个属性。
awards对应一个Map,它有三个key,分别是level1、level2、level3,每个key对应的值又是一个列表。
且列表都含有两个元素,且每个元素都有name、count两个属性。
如果这个明白了,下面请看它对应的Bean,如下图15:

Score和Award是两个静态内部类。一个有三个属性,一个有两个属性。
ScoreProperties类中有两个属性,一个是scores,类型是List<Score>。
一个是awards,类型是Map<String, List<Award>>。
可以看出,它们和yml的结构是完全吻合的。没有难度吧。
为了使它用起来更优雅,SpringBoot定义了两个注解来助它一臂之力。
首先,在Bean上标上@ConfigurationProperties,表示它是一个“配置属性”。
如下图16:

其次,在另一个类上使用@EnableConfigurationProperties注解将其引入。
如下图17:

经过这两步,这个“配置属性”类就已经被注册到容器里了,就变成一个普通的bean了。
这样就可以把它注入到需要的地方,如下图18:

使用的是构造方法注入,并输出一下它的值,看看和yml中配置的是否一样。
结果如下图19:

可以看到,完全没有问题。这就是SpringBoot推荐的方式。
SpringBoot框架内部的源码都是这样用的。
既然“配置属性”类最后注册了bean定义,那可不可用常规的bean定义注册方式呢?
试试就知道了,如下图20:

可以看出,这里使用的@Component注解。
这样的话,就不再需要另一个注解引入了,把它注释掉,如下图21:

其它的都保持不变。然后进行测试,发现完全可以。
不过还是推荐使用SpringBoot指定的方式,因为SpringBoot可以对这种方式进行特殊的优化处理。
比如使用@Validated进行验证。还可以把@NestedConfigurationProperty注解标到嵌套的字段上。
这样不会影响属性值的绑定,但是可以让SpringBoot给你在IDE中进行智能提示。
不然在没有源码的情况下,根本不知道“配置属性”类的结构以及属性名和属性类型。


Spring Boot教程:

Java基础、入门、精通、架构师全套资源​shimo.im

推荐阅读:

java钢铁侠-马克51号:面试被问:如果系统 CPU 突然飙升且 GC 频繁,你该如何排查?​zhuanlan.zhihu.com java钢铁侠-马克51号:七个开源的 Spring Boot 前后端分离项目,一定要收藏!(文末·Spring Boot教程)​zhuanlan.zhihu.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.yml文件_【玩转SpringBoot】配置文件yml的正确打开姿势 的相关文章

随机推荐

  • 【C++】卡常技巧

    1 若乘上一个2的倍数的数值 可改用左移运算符 例1 x x 2 或 x 2 改成 x x lt lt 1 或 x lt lt 1 log22 1 例2 x x 32 或 x 32 改成 x x lt lt 5 或 x lt lt 5 lo
  • 3DMAX渲染完卡住不动该怎么办?

    有很多种原因都可能会导致3DMAX卡死 需要一个一个排查 1 3DMAX和系统语言不兼容 可以把电脑语音设置兼容点上 2 3dmax内存分配不足 把动态内存限制设置到1W以上或是直接设置为0 无限制 3 软件运行错误 可以尝试重置下vray
  • 通信中间件 Fast DDS 基础概念简述与通信示例

    从事汽车软件开发 通信中间件绕不开 当前最火热的无非有 2 种 Some IP 和 DDS DDS 是一种分布式通信标准 有很多商业和开源的实现 Fast DDS 是其中的一种 它在 ROS2 中被应用 而 Apollo 中的 CyberR
  • 基于51单片机用DS1302和LCD1602设计可调式电子日历与时钟(Proteus仿真)

    嵌入式工程师成长日记 https mp weixin qq com s biz Mzg4Mzc3NDUxOQ mid 2247484111 idx 1 sn ce820ea78cf5ff4f00ebb282abc72143 chksm cf
  • Minio整合到springboot

    Minio整合到springboot 1 Minio 1 1 Minio介绍 MinIO 是一个基于Apache License v2 0开源协议的对象存储服务 它兼容亚马逊S3云存储服务接口 非 常适合于存储大容量非结构化的数据 例如图片
  • linux重启mysql

    linux重启mysql的方法 1 直接使用 service mysqld restart 或 service mysql restart 命令重启 2 使用 etc init d mysqld restart 命令重启 1 查看mysql
  • 超神战记不显示服务器,超神战记进不去 闪退及登陆不上解决方法

    超神战记手游进不去 超神战记无法连接服务器 超神战记手游登陆失败 超神战记手游进去就死机 更新失败 或更新之后进不去了 超神战记手游闪退是怎么回事 黑屏怎么回事 闪退怎么办 连接不上 超神战记手游与服务器连接失败 服务器连接异常 登陆不上
  • Machine Learning Yearning(开篇、1、2)

    Machine Learning Yearning 开篇 1 2 Machine Learning Yearning开篇12 开篇 目的 下载 章节名称 Chapter 1Why Machine Learning Strategy Chap
  • CV牛人牛事简介

    CV人物1 Jianbo Shi史建波毕业于UC Berkeley 导师是Jitendra Malik 其最有影响力的研究成果 图像分割 其于2000年在PAMI上多人合作发表 Noramlized cuts and image segme
  • C++学习博客

    网页 https blog csdn net kuweicai article details 82779648 https www cnblogs com inception6 lxc p 8686156 html https www c
  • 浮点数

    为什么要有浮点数 从十进制科学计数法理解浮点数 计算机中二进制的浮点数 二进制中阶码的底也可以不为2 例如 二进制中阶码的底可以为4 为8等等 当阶码的底为2 假设阶码为 1 则小数点需要后移一位 即算数左移一位 当阶码的底为4时 假设阶码
  • CentOS7 上配置Openstack[单机配置]

    本文目录 写在前面 配置前须知 step1 主机设置 step2 配置网口和DHCP确定IP step3 配置网络访问Internet step4 停止网络管理器关闭防火墙 step5 关闭SELinux step6 更新yum step7
  • 深度学习基础知识(发展历史)

    1 深度学习的历史及发展趋势 1 1 深度学习的历史 一般来说 目前为止已经有三次深度学习的发展浪潮 在20 世纪 40 年代到 60 年代深度学习被称为控制论 cybernetics 20 世纪 80 年代到 90 年代深度学习被誉为连接
  • mysql between and 和 大于小于的区别

    1 表达式 between 下界值 and 上界值 限定 表达式 的值介于 下界值 到 上界值 之间的所有值 并且包含 下界值 和 上界值 2 表达式 gt 下界值 and 表达式 lt 上界值 限定 表达式 的值介于 下界值 到 上界值
  • Linux内核调试技术——进程D状态死锁检测

    Linux的进程存在多种状态 如TASK RUNNING的运行态 EXIT DEAD的停止态和TASK INTERRUPTIBLE的接收信号的等待状态等等 可在include linux sched h中查看 其中有一种状态等待为TASK
  • element-ui el-dialog如何设置响应式宽高且永远水平垂直居中

    写在前面 el dialog是使平常使用element ui比较常用的一个组件 想要灵活控制它达到想要的开发效果 就必须要熟悉它默认一些属性 默认width 50 高度为标题和el dialog body el dialog footer内
  • 区块链-一些基本概念

    Hash collision resistance collision free 是说在密码学中 对于一个hash函数 很难找到两个不同的输入使得其hash之后的输出是一样的 Collision resistance is a proper
  • 两性养生网站源码 生活类减肥网站源码 健康网模板源码 支持QQ登录和百度主动推送

    本套模板非常适合生活类 两性类 减肥类等等类型的网站 这类型网站比较好做流量 因为客户群体众多 可以自行改内容为其他类型网站模板总体非常简洁漂亮 配色合理 视觉舒服 并且配合强大的帝国cms7 5核心 未来做大站真心很适合 也可以用来做站群
  • Redis Day02 - springBoot更改Redis默认序列化方式

    默认jdkSerializeable序列化后cli显示 xac xed x00 x05t x00 bcustomer 此刻在cli中get customer 为nil 为避免这种情况的出现 可自行修改序列化方式 只需在启动类自定义序列化类r
  • .yml文件_【玩转SpringBoot】配置文件yml的正确打开姿势

    作者 编程新说李新杰 出自 微信公众号 编程新说 原文 玩转SpringBoot 配置文件yml的正确打开姿势 序言 在很久以前 Spring的配置文件是基于XML的 它的名字就是applicationContext xml 没错 就只有这