4.YAML
-
Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来,因为SpringBoot在底层都给我们自动配置好了。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置。
-
SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。
- application.properties 语法结构:key=value
- application.yml 语法结构:key:空格value
- application.properties 语法结构:key=value
-
application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。
4.1 YAML简介
-
YAML 全称 YAML Ain’t Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。
-
想要使用 YAML 作为属性配置文件(以 .yml 或 .yaml 结尾),需要将 SnakeYAML 库添加到 classpath 下,Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。
-
同名配置文件的优先级:properties>yml>yaml
-
例如:application.yml 属性配置文件
#更改项目端口号
server:
port : 8082
spring:
mail:
host : smtp.qq.com
username : 1322222222226@qq.com
password : nnnnnnnnnnnnnnnn
properties.mail.smtp.ssl.enable : true
datasource:
url : jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username : root
password : 123456
driver-class-name : com.mysql.cj.jdbc.Driver
- 标记语言:以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
<server>
<port>8082</port>
</server>
- YAML 常用写法:YAML 支持以下三种数据结构:
- 对象:键值对的集合
- 数组:一组按次序排列的值
- 字面量:单个的、不可拆分的值
4.2 YAML字面量写法
字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。
在 YAML 中,使用“key:[空格]value**”**的形式表示一对键值对(空格不能省略),如username : root
字面量直接写在键值对的“value**”**中即可,且默认情况下字符串是不需要使用单引号或双引号的。
- 若字符串使用单引号,则会转义特殊字符。
- 注意:属性和值的大小写都是十分敏感的。例子:
name: zhangsan \n lisi
- 输入结果
zhangsan \n lisi
- 若字符串使用双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义
name: zhangsan \n lisi
- 输入结果
zhangsan
lisi
4.3 YAML 对象写法
-
在 YAML 中,对象可能包含多个属性,每一个属性都是一对键值对。
-
YAML 为对象提供了 2 种写法:
-
普通写法,使用缩进表示对象与属性的层级关系。
student:
name : zk
age: 3
- 行内写法:
student:{ name : zk,age:3}
4.4 YAML 数组写法
- YAML 使用“-”表示数组中的元素,普通写法如下:- 空格 item
animal:
- dog
- cat
- pig
- 行内写法
animal: [dog,cat,pig]
- 复合结构:以上三种数据结构可以任意组合使用,以实现不同的用户需求
- YAML 组织结构:一个 YAML 文件可以由一个或多个文档组成,文档之间使用“—**”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“—”**分隔符可以省略。
---
#更改项目端口号
server:
port : 8082
---
spring:
mail:
host : smtp.qq.com
username : 13nnnnnnnnnnn@qq.com
password : nnnnnnnnnnnnnnnnn
properties.mail.smtp.ssl.enable : true
---
datasource:
url : jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username : root
password : 123456
driver-class-name : com.mysql.cj.jdbc.Driver
---
4.5 通过yaml给对象赋值
- redis、temple,全局配置类方式都是这样的方式获取值
- 在application.yml中准备实体类Person的数据
- 属性名是按照setget方法
persion :
name: 张三
age: 18
dog:
name: 修勾
age: 2
goshool: true
birthy: 2022/07/29
maps: {k1: v1,k2: v2}
list:
- java
- python
- go
- 在实体类上加@ConfigurationProperties(prefix = “person”)注解
- 需要导入依赖
<dependency>
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 实体类和yml配置文件的属性值绑定,给注解里添加属性:prefix = “person”
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Dog dog;
private Boolean shool;
private Date birthy;
private Map<String,Object>maps;
private List<Object> list;
}
@ConfigurationProperties作用:
- 将配置文件中配置的每一个属性的值,映射到这个组件中:
- 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
- 参数prefix=”person”:将配置文件中的person下面的所有属性一对应
- 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
- 测试结果
@Test
void test03(){
System.out.println(person);
}
//Person(name=张三, age=18, dog=Dog(name=修勾, age=2), goshool=true, birthy=Fri Jul 29 00:00:00 CST 2022, maps={k1=v1, k2=v2}, list=[java, python, go])
如果要使用propertiesi配置文件可能导入时存在乱码现象,需要在IDEA中进行调整,我们这里直接使用yml文件,将默认的application.properties后缀修改为yml
- 配置文件除了yml还有常用的properties,我们没有讲,propertiesi配置文件在写中文的时候,会有乱码,我们需要去DEA中设置编码格式为UTF-8;settings->FileEncodings中配置;
4.6通过properties给实体类赋值
- 创建自定义的properties:myapplication.properties
name=修勾
age=3
- 实体类进行关联,需使用注解@PropertySource加载指定的配置文件
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource(value = "classpath:myapplication.properties")
public class Dog {
/*spring的spel表达式*/
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@Value("${12*2}")
private Integer age2;
@Value("true")
private Boolean age2;
}
- 测试结果
@Test
void test03(){
System.out.println(dog);
System.out.println(person);
}
//Dog(name=修勾, age=3)
- 给实体属性赋值时,需要用到spring的spel表达式,翻阅博客Spring SpEL表达式语言
4.7 yml占位符的使用
person :
name: 张三${random.uuid}
age: ${random.int}
pets: dog
dog:
name: ${person.pets:hello}修勾
age: 2
goshool: true
birthy: 2022/07/29
maps: {k1: v1,k2: v2}
list:
- java
- python
- go
- 测试
Person(name=张三45c407f2-9ebe-43b3-a496-108444b8fd75, age=1584343770, dog=Dog(name=dog修勾, age=2), goshool=true, birthy=Fri Jul 29 00:00:00 CST 2022, maps={k1=v1, k2=v2}, list=[java, python, go])
- 两种方式对比
-
ConfigurationProperties只需要写一次即可,value则需要每个字段都添加
-
松散绑定:这个什么意思呢?比如我的yml中写的last-name,这个和实体类属性lastName,是一样的,-后面跟着的字母默认是大写的。这就是松散绑定
-
JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性复杂类型封装,yml中可以封装对象,使用@value就不支持
-
结论:
配置yml和配置properties都可以获取到值,强烈推荐yml
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@vlue
如果说,我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用
@configurationProperties,
4.8 JSR303数据校验
-
spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式
-
@validated作用在要验证的类上,见博客springmvc数据校验
下一篇:SpringBoot-06-配置文件介绍和使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123866.html