前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2-Yaml文件

2-Yaml文件

作者头像
Ywrby
发布2022-10-27 13:11:05
4130
发布2022-10-27 13:11:05
举报
文章被收录于专栏:Ywrby

Yaml文件

SpringBoot使用一个全局配置文件,配置文件的名称是固定的,但文件类型有两种

  • application.properties
    • 语法结构:key=value
  • application.yaml (推荐)
    • 语法结构: key: value
    • 注意冒号后边必须跟空格,否则语法结构错误(约定大于配置的体现)

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

YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

YAML 的配置文件后缀为 .yml,如:application.yml

Yaml文件基本语法

代码语言:javascript
复制
# yaml配置文件可以注入到配置类中
# 普通简直对(key=value)
name: Leslie

# 存储对象
person:
  name: Jessica
  age: 18

# 对象的行内写法
person2: {name: Lily,age: 18}

# 数组写法
fruit:
  - apple
  - banana
  - orange

# 数组的行内写法,使用中括号[]
fruit2: [apple,banana,orange]

Yaml给实体类/属性赋值

通过yaml可以直接为实体类赋值,这是之前的properties配置文件无法实现的

赋值步骤

创建实体类,@Component将其注入容器中,@ConfigurationProperties(prefix = “person”)该注解表示将该实体类与application.yml中的person对象绑定起来,即告诉SpringBoot将本类中的所有属性和配置文件中相关配置进行绑定,利用配置文件为其赋值

只有这个类是容器中的组件时,才能使用这种配置赋值方法

代码语言:javascript
复制
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Date birth;
    private Boolean state;
    private Map<String,Object> map;
    private List<Object> list;
    private Pet pet;

    public Person() {
    }

    public Person(String name, Integer age, Date birth, Boolean state, Map<String, Object> map, List<Object> list, Pet pet) {
        this.name = name;
        this.age = age;
        this.birth = birth;
        this.state = state;
        this.map = map;
        this.list = list;
        this.pet = pet;
    }

...
...
代码语言:javascript
复制
public class Pet {
    private String name;
    private int age;

    public Pet() {
    }

    public Pet(String name, int age) {
        this.name = name;
        this.age = age;
    }
...
...

编写application.yml

代码语言:javascript
复制
person:
  name: Leslie
  age: 18
  birth: 2021/2/14
  state: true
  map: {k1: v1,k2: v2}
  list: [l1,l2,l3]
  pet:
    name: Dog
    age: 3

测试结果

代码语言:javascript
复制
@SpringBootTest
class SpringBootTestApplicationTests {
    @Autowired
    Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
        //Person{name='Leslie', age=18, birth=Sun Feb 14 00:00:00 CST 2021, state=true, map={k1=v1, k2=v2}, list=[l1, l2, l3], pet=Pet{name='Dog', age=3}}
    }
}

Yaml文件与properties为属性赋值的区别

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个一个注入

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

松散绑定就是方便我们在对象定义的Java代码中继续使用驼峰命名法(例如:lastName)但是在yml配置文件中可以使用下划线命名法(例如:last-name或last_name或LAST_NAME)来进行匹配

JSR303校验

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

基本内容

扩展部分

使用测试

定义POJO,在类前使用@Validated表示使用JSR303校验,在参数前加注解@Email表示检查传入参数是否符合规定格式

代码语言:javascript
复制
@Component
@ConfigurationProperties(prefix = "pet")
@Validated
public class Pet {
    private String lastName;
    private int age;
    @Email()
    private String email;
...
...

编写yml文件传入参数(可以看到此时email参数不符合规定格式)

代码语言:javascript
复制
pet:
  LAST_NAME: Cat
  age: 1
  email: 233

测试类

代码语言:javascript
复制
@SpringBootTest
class SpringBootTestApplicationTests {
    @Autowired
    Pet pet;
    @Test
    void contextLoads() {
        System.out.println(pet);
    }
}
/* 运行结果:
    Property: pet.email
    Value: 233
    Origin: class path resource [application.yaml] - 31:10
    Reason: 不是一个合法的电子邮件地址
*/

配置文件优先级

项目路径下各个位置核心配置文件的优先级如下:

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

即file路径指的是项目根路径,classpath指的是资源路径即resources目录下,可以看到SpringBoot项目自动创建的核心配置文件是优先级最低的配置文件

当配置文件位于同一路径下时,按照扩展名的优先级顺序如下:properties>yaml>yml,即先加载yml文件,再加载yaml文件,最后加载properties文件

多环境配置

实际企业开发过程中,可能需要在项目的不同阶段使用不同配置文件,这时,就可以在配置中指定不同的配置文件,但所有配置文件都需要以application开头,通过分号-表示不同环境下的配置文件

默认情况下,依然执行application.yaml文件,只有当我们在application.yaml中指定要执行的配置文件时,才会切换环境配置

在application文件中配置时,不需要全部的文件名,只需要写清分号后缀即可

代码语言:javascript
复制
spring:
  profiles:
    active: test

不过yaml支持多文档模块,即将一个文档下的语句通过分隔符分为多个模块,可以简化多文件的创建

yml以—为分隔符,每个分隔符创建一个模块,通过spring.profiles为模块命名

代码语言:javascript
复制
server:
  port: 8080
spring:
  profiles:
    active: test

---

spring:
  profiles: test
server:
  port: 8081
---

spring:
  profiles: dev
server:
  port: 8082

建议配置量小的情况下可以使用多文档模块,配置量较大的情况下还是文件分离更加直观

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Yaml文件
    • Yaml文件基本语法
      • Yaml给实体类/属性赋值
        • 赋值步骤
        • Yaml文件与properties为属性赋值的区别
        • JSR303校验
      • 配置文件优先级
        • 多环境配置
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档