spring boot学习:yaml配置文件

2023-11-18

实际上配置文件application.properties还有application.yaml(application.yml)
我自己实际使用中,就是感觉用yaml能省不少,但是要注意换行空格符号,举个例子有两个属性:server.port 和server.name

propertise

server.port=8081
server.name=zp

yaml

server:
  prot: 8080
  name:zp

如果我们平时配置的名字够长够多,XXX.YYY.ZZZ.MMM.NNN实际上yaml能少些不少,但是可读性没有propetise那么好可读。

yaml的语法:
(说明:语法要求严格)

1、空格不能省略

2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。

3、属性和值的大小写都是十分敏感的。

字面量:普通的值 [ 数字,布尔值,字符串 ]

字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

k: v

注意:双引号和单引号的使用不同

“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;

比如 :name: “kuang \n shen” 输出 :kuang 换行 shen

‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出

比如 :name: ‘kuang \n shen’ 输出 zhang: \n san

对象、Map(键值对)

#对象、Map格式
k: 
    v1:
    v2:

数组( List、set )
用 - 值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

实际上转化的行内写法

pets: [cat,dog,pig]

关于读取配置文件

使用@Value

先有一个Dog实体类,并用@Value设置值

package com.example.demo.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component  //注册bean到容器中
public class Dog {
    @Value("阿黄")
    private String name;
    @Value("18")
    private Integer age;

    //有参无参构造、get、set方法、toString()方法


    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

@SpringBootTest
class DemoApplicationTests {

//	@Test
//	void contextLoads() {
//	}


	@Autowired //将狗狗自动注入进来
	Dog dog;

	@Test
	public void contextLoads() {
		System.out.println(dog); //打印看下狗狗对象
	}

}

在这里插入图片描述

使用yaml + @ConfigurationProperties

先定义一个Person对象在yaml文件上,如下:

person:
  name: zp
  age: 29
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    name: 旺财
    age: 1

然后再有一个person实体类


/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getHappy() {
        return happy;
    }

    public void setHappy(Boolean happy) {
        this.happy = happy;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

测试类写测试方法,注入相关bean

@Autowired
	Person person; //将person自动注入进来

	@Test
	public void contextLoads1() {
		System.out.println(person); //打印person信息
	}

输出
在这里插入图片描述

@PropertySource 和@configurationProperties对比

@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;

@Value和@ConfigurationProperties

在这里插入图片描述
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加

2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性

4、复杂类型封装,yml中可以封装对象 , 使用value就不支持

结论:

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接推荐使用@configurationProperties!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot学习:yaml配置文件 的相关文章

随机推荐

  • (二)Java 虚拟机具体是怎样运行 Java 字节码的?

    Write Once Run Anywhere Java 祖师爷就是由于发现用 C 开发的过程中会花大量的时间处理内存 不同的指令架构等的问题 所以才有高 移植性 的Java 诞生 采访Java 祖师爷的报道链接 And there are
  • sql 优化

    sql 优化 1 mysql 基础架构 1 1 mysql 的组成 2 mysql 存储引擎 2 1MyISAM 2 2 InnoDB 2 3 MyISAM 和 InnoDB 的对比 3 mysql 索引 3 1 Hash 索引 3 2 B
  • QT 中的延时函数和精准定时器的用法

    一 QT中的延时函数比较常用的三种方法 第一种 void MainWindow Delay int msec 这个最准 非阻塞方式延时 现在很多人推荐的方法 QEventLoop loop QTimer singleShot msec lo
  • 知识点——初识java中File类

    1 1 什么是File类 SUN公司提供给开发者操作文件和文件夹的一个类对象 Java中万物皆对象 计算机中万物皆文件 获取File类有三种方式 Constructor 构造方法 File String pathName 根据对应的文件路径
  • 95-31-020-ChannelGroup-DefaultChannelGroup

    1 拓扑图
  • HT1621B液晶驱动(附电路图)

    最近做了一个项目用到了HT1621 电路图 datasheet code HT1621B datasheet include ht1621 h void ht1621 send high order data UCHAR data UCHA
  • JS实现数组扁平化的 5 种方式

    一 普通递归的思路很容易理解 就是通过for循环的方式 逐层逐个元素地去展平 如果当前元素是一个数组 那么就对它进行递归处理 再将递归处理的结果拼接到结果数组上 let arr 1 2 3 4 5 function flatten arr
  • 【简易广告机】利用树莓派制作一个简易的广告机(1)

    利用树莓派做一个简单的广告机 废话不多说开始 1 安装 omxplayer omxplayer 简易介绍 omxplayer是专门针对树莓派的GPU的播放器 支持硬件解码 最高支持分辨率是1080P omxplayer这个命令行播放器 是专
  • 怎么修改vue项目图标和标题

    要修改 Vue 项目的图标和标题 需要在 Vue 项目的 public 目录下添加 favicon ico 文件作为图标 并在 index html 中通过标签修改标题 具体步骤如下 在 public 目录下添加图标 favicon ico
  • 【环境配置】Collecting package metadata (current_repodata.json): failed的问题解决

    在使用conda创建新环境时 出现Collecting package metadata current repodata json failed的问题 尝试了很多方法都没有解决 最后解决了 解决链接 https download csdn
  • JPEG编码过程详解

    JPEG编码过程详解 本文旨在对JPEG编码过程中的细节步骤进行说明 具体原理部分请参照Wikipedia 色彩空间转换 原始图像的像素点是以RGB形式存储的 即每个像素点由3个字节的数据组成 分别为Red通道 Green通道和Blue通道
  • sqlite数据库查看里面数据库版本号

    在android sqlite数据库开发中 常会把手机上的具体数据库拷贝到电脑上进行查看 而数据库升级也比较多 升级也容易出问题 如果有时候某个用户报了一个bug或者测试测出一个bug 然后把他的数据库 db文件拷贝给你 这时候你需要先确定
  • 多线程:多个线程共享数据

    在 Java 传统线程机制中的共享数据方式 大致可以简单分两种情况 多个线程行为一致 共同操作一个数据源 也就是每个线程执行的代码相同 可以使用同一个 Runnable 对象 这个 Runnable 对象中有那个共享数据 例如 卖票系统就可
  • 更进一步!可视化一切递归算法!

    学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章 在线学习网站 https labuladong gitee io algo 上次我发布了算法代码可视化功能 适配了我的网站和我的系列插件 最近我修复了一些 bug
  • 有测试辐射的软件,装个可以查看辐射的APP应用,测测你的手机辐射有多大

    近日关于一款检测手机辐射量的应用Tawkon开始受到媒体和用户关注 这款软件早在去年就已经准备推出iOS版本 最终因为苹果API限制被帮主拒绝 随后他们又开始准备Android版本 并于近日正式发布 手机辐射到现在依然是一个争议性话题 没有
  • 使用指针实现: 输入两个字符串,将这两个字符串连接后输出。

    使用指针实现 输入两个字符串 将这两个字符串连接后输出 include
  • SpringSecurity解决跨域问题的方法

    跨域问题产生原因 现在越来越多的项目都采用前后端分离的开发模式 以实现前后端代码解耦的目的 处于安全考虑 后端服务器对收到的请求进行了限制和区分 因此出现跨域访问不到数据的情况 什么是跨域 当协议 域名 端口号 有一个或多个不同时 前端请求
  • Jira、Redmine横向对比:哪个更适合做研发项目管理

    如果你是一个软件开发团队的成员或者负责人 你可能会遇到这样的问题 该选择哪种项目管理和协作工具来提高工作效率和质量 市面上有很多这样的工具 比如 Redmine 和 Jira 它们都有各自的优缺点 适合不同的场景和需求 本文将从以下几个方面
  • nginx之虚拟主机与请求的分发

    由于IP地址有限 因此经常存在多个主机域名对应同一个IP地址的情况 这时nginx conf中就可以按照server name 对应用户请求中的主机域名 并通过server块来定义虚拟主机 每个server块就是一个虚拟主机 它只处理与之相
  • spring boot学习:yaml配置文件

    实际上配置文件application properties还有application yaml application yml 我自己实际使用中 就是感觉用yaml能省不少 但是要注意换行空格符号 举个例子有两个属性 server port