SpringBoot学习---yaml配置
本篇博客目录:
- 一.什么是yaml
- 二.yaml基础语法与数据类型
- 1.yaml基础语法
- 2.数据类型
- (1) 对象类型
- (2) 数组类型
- (3) 复合结构
- (4) 纯量类型
- (5) 引用
- 三.yaml注入配置文件
- 1.yaml配置注入到实体类
- 2.yaml加载指定的配置文件
- 四.JSR303数据校验
- 五.多环境切换
- 1.properties多环境切换
- 2.yml多环境切换
- 3.配置文件加载位置
一.什么是yaml
百度百科:
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点
,而用反向缩略语重命名。
- yam语言以数据作为中心,而不是以标记语言为重点
- yaml特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲
- YAML 的配置文件后缀为 .yml,如:runoob.yml
二.yaml基础语法与数据类型
1.yaml基础语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
传统xml配置:
<server><port>8081<port>
</server>
yaml配置:
server:port: 8080
2.数据类型
YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
(1) 对象类型
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
行内写法:
缩进表示层级关系,例如获取管理员Id:User.admin.id
注意:
- 冒号后面至少要有一个空格!
- “ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思。
- ’ ’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出。
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:
上面的代码即对象的属性是一个数组 [arrag0,arrag1],对应的值也是一个数组 [value1,value2]
(2) 数组类型
以 -
开头的行表示构成一个数组,单独一列表示一个数组元素:
表示一个数组:
表示数组中的一个元素:
行内表示:
多维数组表示:
行内表示:
一个相对复杂的例子:
行内表示:
(3) 复合结构
数组和对象可以构成复合结构,例:
转换为 json 为:
{ languages: [ 'Ruby', 'Perl', 'Python'],websites: {YAML: 'yaml.org',Ruby: 'ruby-lang.org',Python: 'python.org',Perl: 'use.perl.org' }
}
(4) 纯量类型
纯量是最基本的,不可再分的值,包括:字符串,布尔值,整数,浮点数,Null ,时间,日期。
(5) 引用
&
用来建立锚点(defaults)<<
表示合并到当前数据*
用来引用锚点
相当于:
三.yaml注入配置文件
1.yaml配置注入到实体类
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
以前实体类注入(通过Value(“值”)进行实体类初始化操作):
创建一个实体类User.Java
备注(不要忘了导入lombok的依赖):
测试类:
运行效果:
我们可以通过yaml对整个实体进行初始化操作:
在resources文件下创建一个application.yaml
在application.yam中添加如下对象
导入依赖
在实体类中添加@ConfigurationProperties(prefix = “user”)
备注:上面name初始化为"李四",age初始化为28
运行测试类:
从上面的运行结果发现name注入的值为Administrator?what?,这不是我的电脑用户名嘛,网上查了一下说user.name可能是系统属性,哈哈好吧,这里就把name修改为userName(或者将@ConfigurationProperties的值的user修改一下)
当然测试类也要修改一下:
然后再次运行(从上面的操作来看@value和yaml注入,同时使用的情况下,最后初始化的值为yaml配置文件):
2.yaml加载指定的配置文件
- @configurationProperties:默认从全局配置文件中获取值;
- @PropertySource :加载指定的配置文件;
在上面通过yaml进行实体类注入的时候使用了@configurationPropertiesm,这个标签表示默认从全局配置文件(全局文件:xxx.properties和xxx.yaml)中获取值,除此之外还有一个@PropertySource表示加载指定的配置文件;
实例:
新增一个people.properties文件
在实体类中使用@PropertySource标签,然后通过@Value("${name}")单个绑定properties文件中的属性:
备注:将@ConfigurationProperties(prefix = “user”)注释掉
运行测试类:
注意:properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;
File->Settings…
在FileEncodings中红框框处修改编码为UTF-8
再次运行(xxx.propertis中字符串不需要加""
):
- @configurationProperties与@PropertySource
- yaml文件暂不支持使用@PropertySource("")注解,但是支持@ConfigurationProperties(prefix = “”)
- @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
- 松散绑定: yaml中写 last-name, 可以映射为Java类中驼峰命名的 lastName。’ - ’ 后第一个字母默认为大写
- JSR303数据校验: 给字段加一层过滤器验证,保证数据的合法性
- 复杂类型封装,yml中可以封装对象 , 使用value就不支持
四.JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;
- 导入依赖:
- 新建一个EmailInfo类:
在application.yaml中给emailPath注入参数:
- 测试类:
运行效果:
修改application.yaml中emailPath的格式为邮箱格式:
再次运行:
使用数据校验,可以保证数据的正确性,常见的校验参数:
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false 长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则.......等等
除此以外,我们还可以自定义一些数据校验规则
五.多环境切换
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yaml ,
用来指定多个环境版本;
例如:
properties:
- application-test.properties 代表测试环境配置
- application-dev.properties 代表开发环境配置
- application-prod.properties正式环境配置
yaml:
- application-test.yaml 代表测试环境配置
- application-dev.yaml 代表开发环境配置
- application-prod.yaml 正式环境配置
1.properties多环境切换
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
spring.profiles.active=dev
:使用application-dev.properties配置环境
创建 application-test.properties和application-dev.properties
在application.properties中设置端口为8088
application-test.properties中设置端口为8090
application-dev.properties中设置端口为8089
备注:在创建项目的时候我已经导入Web依赖,没有导入需要手动导入,如下:
运行项目:
在application.properties中新增**spring.profiles.active=dev
**
运行效果:
2.yml多环境切换
创建一个application.yaml,在该文件下加入如下配置:
server:port: 8081
#选择要激活那个环境块
spring:profiles:active: prod---
server:port: 8083
spring:profiles: dev #配置环境的名称---server:port: 8084
spring:profiles: prod #配置环境的名称
将application.properties中的配置注释掉:
运行效果:
和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了,如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的。
3.配置文件加载位置
外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!
官方外部配置文件说明参考文档中四种目录:
- file:./config/
- file:./
- classpath:/config/
- classpath:/
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:
优先级由高到底,高优先级的配置会覆盖低优先级的配置:
- 优先级1:项目路径下的config文件夹配置文件
- 优先级2:项目路径下配置文件
- 优先级3:资源路径下的config文件夹配置文件
- 优先级4:资源路径下配置文件
新建一个SpringBoot项目来测试一下:
在项目文件下创建一个application.yaml(配置端口为9002),然后再创建一个config文件在该文件下再创建一个application.yaml(配置端口为9001)。
然后在项目src下的资源文件(resources)下创建application.yaml(设置端口为9004)和config目录下application.yam(设置端口为9003)
加载web依赖:
运行项目:
(执行9001端口先执行的是项目下config文件下的application.yaml配置,然后注释掉,再次运行)
运行项目:
(执行9002端口,执行的是项目下的application.yaml配置,然后注释掉,再次运行)
运行项目:
(执行9003端口,执行的是项目下src下的资源文件(resources)下config文件下的application.yaml配置,然后注释掉,再次运行)
运行项目:
SpringBoot学习---yaml配置相关推荐
- SpringBoot配置文件YAML配置注入(详解)
目录 一.SpringBoot配置文件 1. SpringBoot默认配置文件 2. 配置文件的作用 3. 配置文件的位置 4. 多环境切换 方式一:多配置文件 方式二:一个配置文件(yaml的多文档 ...
- SpringBoot中yaml配置
yaml是一种可读性高,用来表示数据序列化的格式.在SpringBoot中也可以使用properties,但是推荐使用yaml. 在SpringBoot中使用一种全局的配置文件,其名称是固定的为app ...
- SpringBoot:yaml配置及语法、yml数据读取、多环境开发控制
yaml 配置 YAML(YAML Ain't Markup Language),一种数据序列化格式 优点: 容易阅读 容易与脚本语言交互 以数据为核心,重数据轻格式 YAML文件扩展名 .yml(主 ...
- 深圳Java培训学习:SpringBoot的yml配置及多环境切换【千锋】
深圳Java培训学习:SpringBoot的yml配置及多环境切换[千锋] 1,配置风格 从application.properties转换到application.yml 并不改变功能效果,只是改变 ...
- CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出
本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...
- SpringBoot学习笔记-2:第二章 Spring Boot 配置
第二章 Spring Boot 配置 1.YAML 配置 SpringBoot 全局配置文件 application.properties application.yml YAML 以数据为中心,比 ...
- springboot的自动配置原理
SpringBoot中的默认配置 通过刚才的学习,我们知道@EnableAutoConfiguration会开启SpringBoot的自动配置,并且根据你引入的依赖来生效对应的默认配置.那么问题来了: ...
- SpringBoot约定大于配置的特性解读 SpringBoot快速入门
SpringBoot约定大于配置 Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的 ...
- SpringBoot学习-Day1
学习目标 学会SpringBoot 对应项目SpringBoot_Demo中的 day1 学习笔记 1 SpringBoot概述 1.1 概念 SpringBoot提供了一种快速使用Spring的方式 ...
- springboot学习
微服务阶段 注意:部分图片截图还未更新上传,待续 Javase Mysql Html+css+js+jquery Javaweb Ssm War:tomcat运行 Spring 再简化:springb ...
最新文章
- 三星手机Android9和10的区别,三星开始在Galaxy Note 9上测试Android 10
- sublime中文输入(转)
- P7443-加边【博弈论】
- spring和maven_具有Spring和Maven教程的JAX–WS
- Linux 命令之 cd 命令-切换目录
- VMware发布面向未来的员工工作解决方案,满足分散办公需求
- queue emplace_c++ queue、deque、priority_queue/队列最大值/滑动窗口/top K
- js原生attachEvent与addEventListener的用法
- python批量读取Excel文件
- python棋盘放麦粒_从零开始学习PYTHON3讲义(五)while循环和棋盘麦粒问题
- c语言美元符号用法,R函数()中美元符号“$”的含义是什么?
- 关于数字万用表你需要知道的知识
- 深入理解游戏中寻路算法
- SQL Story(十)————游标的应该与不应该 (转)
- 数据库的原理【经典】
- Ubuntu安装 apache2 mysql php5 freeradius
- linux cpu降频怎么设置,Android系统修改CPU降频温度阈值、修改CPU关内核温度阈值的方法...
- 【学习笔记】数组的地址分配及指针数组的使用
- Leetcode 307.区域检索-数组可修改
- 使用AFN上传图片 下载图片
热门文章
- 阿里云推出全球云网络人才赋能计划,打造云网络认证体系
- 物联网的“最好”与“最坏”之间往往只差了一个“安全”
- 2050: 技术未必会使我们摆脱愚昧,有时正相反(上)
- yosemite java 6_Mac OS X Yosemite 安装Java6
- 【目标定位】基于matlab扩展卡尔曼算法SLAM(运动轨迹+误差 )【含Matlab源码 1637期】
- 【疾病分类】基于matlab SVM植物叶子疾病检测和分类【含Matlab源码 093期】
- java将一个字符串数组复制到一个字符串_C语言 | 将元音字母复制到另一个字符串中...
- java 8 特点_Java8的特性有哪些
- mysql mvcc 并发update_关于mysql的InnoDB多版本并发控制(MVCC)与事务隔离级别的疑问?...
- oracle数据库双机热备原理,oracle数据库双机热备方案