文章目录
一、配置文件作用
一个项目中最重要的信息都是在配置文件中配置的,譬如:
1、数据库的连接信息(包含用户名和密码的设置)
2、项目的启动端口
SpringBoot默认的运行端口是8080,当进行微服务开发时,一般都是一个主机部署多份程序或者多个主机部署多份程序。此时会希望一个项目中彼此独立的多个模块在当前电脑上都启动起来,由于每一个应用只能跑一个端口号,所有此时这些彼此独立的模块就需要设置不同端口
3、第三方系统的调用秘钥等信息。
譬如说:大学生在学校学习线上选修课的时候,一般都是使用智慧树/学习通APP进行学习,智慧树APP会记录学生选修课的学习进度以及考试通过情况,期末时,学校的教务系统就会从智慧树中获取到学生选修课的通过率。
那么教务系统是如何从第三方智慧树APP调用接口获取到隶属自己学校学生的选修课通过情况?其实就是学校教务系统使用智慧树APP提供的秘钥,拿到对智慧树的访问权限,获取智慧树给学校教务系统提供的查询自己本校学生选修课通过情况的接口。这样就可以防止学生信息泄露,保证学生个人信息安全。
教务系统可能会有多个地方需要使用秘钥进行访问智慧树APP,因此在项目中访问一个全局变量,一般有两种方式:1、放在全局类里2、放在配置文件中。
把秘钥放在一个全局类里,系统就可以调用了,但是这样会导致项目打包后,秘钥无法再修改(因为测试时和线上使用的秘钥是不同的,项目打包进行线上部署时,运维需要把程序员编写程序时使用的调试秘钥改成线上生产环境的秘钥),并且部署项目时要将项目打包,打包后jar包里的所有.java代码都变成了字节码文件,无法修改。
将秘钥放在配置文件里,配置文件是存在目录里,解压缩打包后的jar包,打开目录,此时还是能对配置文件进行修改,修改完的配置文件再放回压缩包就行了,不会对已打包的jar包有任何影响,方便进行项目部署。
4、用于设置发现和定位问题的普通日志和异常日志、日志的等级设置等。
二、配置文件分类
1、系统使用的配置文件(系统配置文件),如:端口号的配置、连接数据库的配置。如果想要了解更多系统配置文件里的配置项,打开官方文档链接即可。
2、用户自定义配置文件
譬如说:有些学校的教务系统不需要去访问第三方智慧树APP来获取学生线上选修课的通过率,他们自己使用自己学校内部开发的APP,那么此时这些学校就不需要在配置文件里配置第三方智慧树APP的秘钥了。因此这个第三方秘钥也可以说是一种用户自定义的配置文件。
特殊说明:
对于一个 SpringBoot 项目中,可以有两种格式的配置文件(但项目中通常只会使用一种格式的配置文件),当项目中同时含有两种配置文件时,两种配置文件中都存在了相同配置项(就像一个项目含有两种格式配置文件,两个配置文件设置了端口号时设置了不同的端口号),此时优先以 .properties 配置文件中的内容为准。
如果项目中含有多个格式、多个配置文件,希望指定读取某个配置文件,就可以使用注解 @PropertySource(value = “配置文件名”,encoding = “utf-8”),但是有可能你设置的 utf-8也没办法解决.properties的遗留问题:中文乱码,因为注解设置了utf-8,还需要需要配置文件的页面右下角含有 utf-8,这两个配合到一块,才能解决该问题。
三、SpringBoot内置的配置文件格式
SpringBoot内置的配置文件格式有以下两种,需要学会设置这两种配置文件并读取。
3.1、.properties
3.1.1、.properties配置语法
.properties 以键值的形式配置,key 和 value 之间以 = 连接:即 key=value
3.1.2、.properties读取方式
此时我们自定义的配置信息:myvalue=20,在代码中应该如何读取??使用注解 @Value($“配置项的键”) 即可读取。
正确写法读取配置项的值:
读取成功:
如果配置项内容写的是中文,有可能显示的是乱码,乱码无非两个原因:1、读取到的时候,数据就是乱码的 2、返回数据的时候导致了乱码。目前没办法明确乱码原因,可以通过在 return 语句初打断点,进行调试,明确问题。
代码中类加了@Controller 注解,此时类会随着Spring的启动而启动,类启动就会执行构造方法,此时可以将一些代码放在构造方法中执行。 属性的初始化是在构造方法之前。
3.2、.yml/.yaml
3.2.1、.yml配置语法
key: value , value和 :之间,必须有一个空格,语法才会生效,否则报错!
3.2.2、.yml读取形式
跟.properties 一样。
四、两种配置文件优缺点
4.1、.properties
1、配置信息含有中文时容易出现乱码问题
2、信息冗余
4.2、.yml
1、语法和 JSON 语言类似,写法简单,易于理解
2、同时.yml支持更多数据类型,适合用来编辑配置文件
3、 支持更多编程语言:如 Golang、PHP、Python、JavaScript…
4、不冗余
5、配置项含有中文信息时不会乱码
4.2.1、.yml支持更多数据类型
1、字符串
.yml中配置字符串 数据类型时:(.yml中配置字符串 “” 很危险,不会原样输出,含有特殊字符时执行特殊字符的含义,譬如 \n、\r、\f…)
2、.yml中配置对象[!]
写法1:(常见写法)
写法2:行内写法
yml中对象的读取方式:
读取配置文件中的配置项:对象时,要借助一个实体类,该实体类中的字段名必须与配置项中的字段名一致。
新建实体类:(实体类必须含有注解@ConfigurationProperties(“配置项的key值”))
3、.yml中配置集合:
读取方式:跟读取对象一样,都需要新建实体类,实体类的类名是什么无所谓,但是字段名必须要对应上!
新建实体类:
五、.properties vs .yml/.yaml
1、properties是以key=value的形式配置的键值类型的配置文件,而yml使用的是类似json格式的树形配置式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和value之间使用“:”英文冒号加空格的方式设置,并且空格不可省略。
2、properties为早期并且默认的配置文件格式,但其配置存在- -定的冗余数据, 使用yml可以很好的解决数据冗余的问题。
3、yml通用性更好,支持更多语言,如Java. Go、 Python 等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。yml支持更多的数据类型。
六、设置不同环境的配置文件[!]
一个项目里,会有不同环境的配置信息,譬如说:开发环境,开发环境一般连接本地库;生产环境要求连接生产的库;测试环境要求连接测试的库…因此配置文件里的配置项信息是完全不同的。此时应该怎么办??
1、方法1:
2、方法2:(常用方法)
不同环境创建不同配置文件。
开发环境:创建一个命名为:application-dev.yml 的配置文件,其中 application- .yml 是固定格式,- 后面的命名随你自己定。
生产环境:创建一个命名为:application-prod.yml 的配置文件,其中 application- .yml 是固定格式,- 后面的命名随你自己定。
那么此时 对于application-dev.yml 、application-prod.yml 这样的配置文件来说,application.yml 、application.properties 是他们的主配置文件,可以在主配置文件中,设置不同环境下的配置文件。