目录
配置文件到底有什么作用呢 ?
SpringBoot的配置文件的格式有哪些呢?
properties配置文件
yml配置文件
properties乱码问题
多平台的配置文件设置
配置文件到底有什么作用呢 ?
配置文件主要是配置项目的一些重要的数据..
- 比如配置数据库的连接信息
数据库是非常重要的一环,可以进行持久化存储,所以在做项目的时候使用数据库那是必须的.以前JDBC是直接写代码写用户名,密码.... 现在到了框架只需要配置即可.
- 项目的启动端口
就比如一个教务管理系统它是分为学生端和老师端的,每一个的界面都是不一样的,就需要进行配置
- 再比如 : 第三方的调用密钥等信息
- 在比如 : 用于发现和定位问题的普通日志与异常日志...
配置文件都是对非常关键的数据进行配置的.所以是非常重要的.
SpringBoot的配置文件的格式有哪些呢?
SpringBoot配置文件的格式主要分为以下两种格式
- 一种是properties
- 一种是yml
我们先来看一看这两种配置文件的格式长啥样?
这里要注意一下,我们上一篇文章也讲过关于SpringBoot的核心设计思想,那就是约定大于配置.
什么意思呢?我们在来回忆一下
对于SpringBoot来说它不再像Spring那样需要配置繁琐的配置文件,SpringBoot它自己就会将配置文件配置好,不需要你自己去配置了.这就提高了效率.也就是当你在使用SpringBoot开发程序的时候使用它框架的默认配置就可以,如果你的需求与它默认的配置不符,那你就需要进行重写或者修改一些配置完成你的需求就行.
意思就是SpringBoot都会给你配置好,你只需要按照它的规定/约定去使用,不违反这个约定就可以使用SpringBoot进行高效的进行开发 这就是SpringBoot 的核心设计思想 : "约定大于配置"
我们一般会有这些约定 :
比如 :
- 我们的Maven的目录结构,默认有resource文件夹来存放资源配置文件.我们默认生成的类都在target文件夹下
- SpringBoot的配置文件必须是 application.的命名形式并且唯一. 比如application.properties /application.yml
- 我们的启动类和我们自己写的带注解的类必须在同一级目录/同一级的子目录下
- application.yml中默认属性。数据库连接信息必须是以spring: datasource: 为前缀;多环境配置。该属性可以根据运行环境自动读取不同的配置文件;端口号、请求路径等
- Spring Boot会自动内置Tomcat容器来运行 Web 应用,我们不需要再去单独做应用部署。
对于我们SpringBoot的这个配置文件 必须是 application.的命名形式 比如application.properties 或者是application.yml,
这是SpringBoot的约定,我们不能违反否则的话,我们的配置文件就会不生效
既然有两种配置文件,都同时配置了,最终按照哪种配置文件进行配置呢?
我分别给两种配置文件都设置了不同的端口号,可以看出最终启动端口号为.properties配置文件设置的.
可以得出结论: 当两种配置文件都同时配置了同样的配置,.properties优先级高一些,但是不代表yml就不配置了.加载.properties文件之后,也会加载.yml配置文件.
虽然,存在两种格式的配置文件 yml和properties,但是在实际开发为了更好地维护,会统一使用一种格式的配置文件.
properties配置文件
对于properties配置文件我们先学习一下它的基本语法,然后再来学怎么配置/怎么存,然后在学习怎么取出来
properties配置文件的基本语法
基本语法也就是 key = value的形式
我们配置的内容其实又分为系统配置和自定义的配置
配置系统的一些配置
比如我们来配置一个指定的端口号
比如我们要配置数据库的连接信息
用户自定义的配置项
如何读取配置文件呢?
SpringBoot给我们提供了一个@Value注解用来读取配置文件的.
语法格式 : @Value(${xxxx})
注意注意注意 : 我们不能写成@Value(xxxx) 这样,如果是这样的话它是会直接把xxx赋值给那个成员变量的.
如果写成@Value(${xxxx}) 这样正确的写法就是读取xxxx找到对应的key将Value返回给成员变量
比如我们读取系统配置项-->端口号port
我们再来读取一下用户自定义的配置项
properties配置文件的优缺点
优点 :
- properties的配置文件写法简单. key对应着value key=value的形式
缺点 :
- 会有很多的冗余代码,对于同样的前缀可能要写多次
比如我们配置数据库连接信息的时候
spring.datasource 有多个冗余的代码,前缀要写很多次
yml配置文件
YAML是一种人类可读的数据序列化语言,一般YAML通常用于配置文件,与属性文件相比,如果我们想要与配置文件中添加复杂的属性,YAML更加结构化,很少混淆,YAML分层配置数据.相比于properties配置的方式,YAML配置的方式更加直观清晰,简洁明了,有层次感.
YML配置文件的优点
- ym配置文件,可读性高,写法简单,易于理解.
- yml支持更多的数据类型,如 : 对象(键值对的集合),数组,纯量(字符串,布尔值,整数,浮点数,Null,时间日期....).
- yml支持更多的编程语言(比如Java,Golang,PHP,Python.....等)
YMAL支持这么多语言有什么用??
有些人就会问,我YAML支持那么多编程语言有什么用,我就用Java.
当在大公司里面都是分项目小组的,彼此之间是相互独立的,这些组用到的数据库是一样的,但用户数据是互通的,由于用户太多就要使用微服务,也就意味着一个程序要部署到成千上万个机器上(一万个节点),就需要一万个配置,这时当运维做了调整和升级的时候,这些配置文件就都需要改变,这时候维护性就变得很高很高.
那让这些小组都读同一份配置-->配置文件格式相同, 也就是所有的配置文件都走一份在线的配置文件.这个时候由于我们YML是跨语言的,所有语言都可以读取一份YML,都调这一份(配置一份在线配置文件)就可以了,这样运维在做调整和升级,那份在线的配置就会同步更新,就能够读取到了
YML语法
- 大小写敏感
- 使用缩进表示层级关系(第一个层级前面不加空格,每一个层级的前面都比上面多加一个TAB键用于缩进表示层级关系,同一层级元素左对齐即可)
- '#'表示注释
这种带有层次的结构可读性更高,写法简单,相比于.properties格式的配置文件省去了冗余的前缀.
我们可以比对一下
注意 :
YAML语法格式:
- 使用缩进表示层级关系(第一个层级前面不加空格,每一个层级的前面都比上面多加一个TAB键用于缩进表示层级关系,同一层级元素左对齐即可)
每一个层级在进行配置的时候是 : key: val(key冒号空格val) 记住在配置的时候val前面一定要加空格.否则配置失败,也不会出现代码高亮.
YAML配置数据库
用户自定义配置项
YAML可以配置更多的数据类型,我们依次来演示一下
我们来检验一下进行读取
读取YAML配置还是使用@VALUE注解进行读取
还有一点需要注意的是
配置字符串的时候,可以啥也不加直接写中文,也可以加单引号,也可以加双引号
但是只有加双引号时候特殊符号才会起作用
YAML配置对象
配置People对象
读取方式一
读取People对象中的属性
对应层级关系我们可以利用 .(点) 来进行访问.
我们上面那种读取是将people一个一个属性读取的,我们有没有一种方式可以读取一个对象呢 ? 然后通过对象来访问这些属性.
读取方式二
要想读取people对象,那就先创建出一个people对象.
通过@ConfigurationProperties 注解来进行读取配置文件,将配置文件配置的属性赋值到当前people对象中.
注意还要加一个@Component注解,代表将这个对象存到Spring中--->在SpringBoot项目一启动时就会扫描启动类的同级目录下的类,包,子包,如果有Component注解就将其存到Spring中.
读取对象注意事项
- 读取配置文件中的实体类时,一定要有setter方法,因为@ConfigurationProperties注解在实现的时候是通过setter将配置文件中的内容赋值给字段/属性的.
- ConfigurationProperties需要和注册注解Component(放入到Spring中)进行一起使用,否则就不能将其存放到Spring中,也不能依赖注入了
行内写法
@ConfigurationProperties
@ConfigurationProperties 是一种读取配置文件的一种方式,通过指定配置的前缀(配置的标识),来读取配置文件中的内容.
@ConfigurationProperties 和 @Value 的使用略微不同,@Value 是读取单个配置项的,而 @ConfigurationProperties 是读取一组配置项的,我们可以使用 @ConfigurationProperties 加实体类读取一组配置项,其中 prefix 表示读取一组配置项的name,相当于 Java 中的类名,最后再把此配置类,注入到某一个类中就可以使用了
YAML配置集合
比如 在一个项目中可能使用多种数据库,这时候多个数据库就相当于一个集合,我就就可以自定义配置,来配置集合.
我们接下来来演示一下 :
集合中每一个元素 利用 - (杠 + 空格)
项目支持很多种类型的数据库
集合名字
集合属性名--->接收多个值
- 值
- 值
如何读取集合呢 ?
还是利用ConfigurationProperties(prefix = "") 来进行读取
还是要加一个Component注解
我们可以写setter和getter也可以直接加一个注解
那这个setter和getter注解其实在我们.class文件编译的时候还是使用的是加上setter方法和getter方法
在讲解日志lombok的时候再来讲解原理
properties乱码问题
在你没有处理这个问题之前,每当你重新打开一个properties这个配置文件,你就会发现你的注释全变成了乱码.
原因就是配置文件的默认编码格式不是UTF-8
所以我们就要把当前项目和新项目的编码格式改成UTF-8就可以解决了
当前项目 :
新项目 :
多平台的配置文件设置
为什么会有多平台配置文件设置??
一般在公司都要分多种配置文件,因为有多种环境比如,开发环境,测试环境,生产环境... 每种环境需求并不一样,所以自然配置就不一样.就比如我开发环境就需要多的日志来帮程序猿排查问题,解决问题,而对于生产环境,也就是用户用的环境,不需要打印多的日志,这样会影响速度.
总之,分多平台的配置文件设置就是为了更好地维护每种环境所要应对的事情.
如果不设置多平台的配置文件,就用那一份主的配置文件,那么每种环境配置的都不一样,每次运行的时候都要修改.这就很麻烦了.
好接下来我们按照这三种常见的环境进行配置
-- 开发环境的配置文件
-- 测试环境的配置文件
-- 生产环境的配置文件
一般文件格式都是以 application 或 application-xxx... .yml
一定是按照这种格式的,因为springboot ->有一个特点 就是 "约定大于配置"
我们需要在主yml配置文件设置使用哪种环境为运行环境