当前位置: 首页 > news >正文

SpringBoot yml配置注入

yaml语法学习

1、配置文件

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties

    • 语法结构 :key=value
  • application.yml

    • 语法结构 :key:空格 value

配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;比如我们可以在配置文件中修改Tomcat 默认启动的端口号!

server:port: 8081

SpringBoot内置属性查询:官方文档地址

2、YAML/YML

yaml概述

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

  • 这种语言以数据作为中心,而不是以标记语言为重点!

  • 以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml

    • 传统xml配置:

      <server><port>8081<port>
      </server>
      
    • yaml配置:

      server:prot: 8080
      

yaml基础语法

说明:语法要求严格!

  1. 空格不能省略

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

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

  4. #号表示注释

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

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

    注意:

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

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

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

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

对象、Map(键值对)

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

在下一行来写对象的属性和值得关系,注意缩进;比如:

student:name: limingage: 3

行内写法

student: {name: qinjiang,age: 3}

数组和对象数组( List、set )

用 - 值表示数组中的一个元素,比如:

#数组
pets:- cat- dog- pig
#对象数组
users:- name: Tomage: 4- name: Jerryage: 5

行内写法

#数组
pets: [cat,dog,pig]
#对象数组
users[{name: Tom,age: 4},{name: Jerry,age: 5}]

注入配置文件

yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!

yaml注入配置文件

  1. 在springboot项目中的resources目录下新建一个文件 application.yml

  2. 编写一个实体类 Dog;

    package nuc.ss.pojo;@Component  //注册bean到容器中
    public class Dog {private String name;private Integer age;//有参无参构造、get、set方法、toString()方法  
    }
    
  3. 思考,我们原来是如何给bean注入属性值的!@Value,给狗狗类测试一下:

    @Component //注册bean
    public class Dog {@Value("阿黄")private String name;@Value("18")private Integer age;
    }
    
  4. 在SpringBoot的测试类下注入狗狗输出一下;

    @SpringBootTest
    class Springboot02ConfigApplicationTests {@Autowiredprivate Dog dog;@Testvoid contextLoads() {System.out.println(dog);}}

    结果成功输出,@Value注入成功,这是我们原来的办法对吧。

  5. 我们在编写一个复杂一点的实体类:Person 类

    @Component //注册bean到容器中
    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;//有参无参构造、get、set方法、toString()方法  
    }
    
  6. 我们来使用yaml配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个yaml配置!

    person:name: limingage: 3happy: falsebirth: 2000/01/01maps: {k1: v1,k2: v2}lists:- code- girl- musicdog:name: 旺财age: 1
    
  7. 我们刚才已经把person这个对象的所有值都写好了,我们现在来注入到我们的类中!

    /*
    @ConfigurationProperties作用:
    将配置文件中配置的每一个属性的值,映射到这个组件中;
    告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
    参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
    */
    @Component
    @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;//有参无参构造、get、set方法、toString()方法
    }
  8. 确认以上配置都OK之后,我们去测试类中测试一下:

    @SpringBootTest
    class Springboot02ConfigApplicationTests {@Autowiredprivate Person person;@Testvoid contextLoads() {System.out.println(person);}}

    结果:所有值全部注入成功!

加载指定的配置文件

  • @PropertySource :加载指定的配置文件;
  • @configurationProperties:默认从全局配置文件中获取值;
  1. 我们去在resources目录下新建一个person.properties文件

    name=kuangshen
    
  2. 然后在我们的代码中指定加载person.properties文件

    @PropertySource(value = "classpath:person.properties")
    @Component //注册bean
    public class Person {@Value("${name}")private String name;......  
    }
    
  3. 再次输出测试一下:指定配置文件绑定成功!

配置文件占位符

配置文件还可以编写占位符生成随机数

person:name: liming${random.uuid}age: ${random.int}happy: falsebirth: 2020/07/13maps: {k1: v1,k2: v2}lists:- code- music- girldog:name: ${person.hell:hello}_旺财age: 3

回顾properties配置

  • 我们上面采用的yaml方法都是最简单的方式,开发中最常用的;
  • 也是springboot所推荐的!
  • 那我们来唠唠其他的实现方式,道理都是相同的;写还是那样写;配置文件除了yml还有我们之前常用的properties , 我们没有讲,我们来唠唠!

【注意】properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;settings–>FileEncodings 中配置;

对比小结

@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图

@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持
  1. @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加

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

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

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

结论:

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

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

  • 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

http://www.lryc.cn/news/120323.html

相关文章:

  • 中科亿海微乘法器(LPMMULT)
  • Redis_持久化(AOF、RDB)
  • 开源数据库Mysql_DBA运维实战 (部署服务篇)
  • 【Java学习】System.Console使用
  • 从零学算法154
  • 95 | Python 设计模式 —— 策略模式
  • 【BASH】回顾与知识点梳理(十九)
  • Selenium之css怎么实现元素定位?
  • 计算机基础之RAID技术
  • 辽宁线上3D三维虚拟工厂生产仿真系统应用场景及优势
  • csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表
  • (WWW2023)论文阅读-Detecting Social Media Manipulation in Low-ResourceLanguages
  • centos-stream-9 centos9 配置国内yum源 阿里云源
  • 查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo
  • js和nodejs如何将文件切片和合并
  • Java内存模型
  • [国产MCU]-BL602开发实例-看门狗定时器(WDG)
  • 28 | Boss直聘数据分析
  • Hash 缓存
  • 腾讯云CVM服务器标准型S5性能CPU处理器测试
  • 【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题
  • 【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?
  • 机器学习深度学习——seq2seq实现机器翻译(数据集处理)
  • 锁定Mac的内置键盘,防止外接键盘时的误触
  • 由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题
  • 解决Vue+Element UI使用el-dropdown(下拉菜单)国际化时菜单label信息没有刷新的情况
  • Prometheus技术文档-概念
  • JQuery判断radio(单选框)是否选中和获取选中值方法总结
  • Effective Python 读书笔记
  • Monge矩阵