4. 配置文件
员工管理的增删改查功能我们已开发完成,但在我们所开发的程序中还一些小问题,下面我们就来分析一下当前案例中存在的问题以及如何优化解决。
4.1 参数配置化
在我们之前编写的程序中进行文件上传时,需要调用AliOSSUtils工具类,将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时,需要一些参数:
-
endpoint // 阿里云OSS域名
-
accessKeyID // 用户身份ID
-
accessKeySecret // 用户密钥
-
bucketName // 存储空间的名字
关于以上的这些阿里云相关配置信息,我们是直接写死在Java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:
如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐)
如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,导致不方便集中的管理和维护)
思考:怎样将这些参数集中配置管理呢?
回答:Java代码会有很多这毋庸置疑,但是对于SpringBoot项目来说,什么东西一般只有一个?配置文件只有一个,代码当中所有容易变动的参数建议放在配置文件当中进行管理和维护,也就是application.properties。
将参数集中保存/配置在properties配置文件当中的优点:
- 在application.properties当中的配置做了修改,我们不用进行编译,而且,所有的配置如果都交给了application.properties配置文件来集中管理,以后如果我们想修改,我们直接找到properties配置文件来做一个修改就可以了,软编码。
- 其次,安全:敏感的参数(如数据库连接密码)不应该直接硬编码在代码中,而是通过配置文件进行管理,这样可以降低配置泄漏的风险,并更好的保护敏感信息。
- 灵活性和可移植性:不同环境的参数配置只需在对应的配置文件中进行修改即可。
- 易用性和可读性:将参数配置到配置文件中,使得参数的设置更加直观和易于理解,提高配置文件的可读性和维护性。
注意:这里的配置文件指的可不是pom.xml,pom.xml这份配置文件是Maven项目的配置文件,是用来配置依赖的,而application.properties才是SpringBoot项目的配置文件。
为了解决以上分析的问题,我们可以将参数配置在配置文件中。而application.properties配置文件的形式就是key = value,前面的key可以自己定义,注意在项目开发时,尽量要定义的有一定的业务含义,如下:
问题解决:
#自定义的阿里云OSS配置信息
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret=4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketName=gch-web-tlias01
注意:
- 由于properties配置文件当中的信息本身就是一个字符串,所以我们就不需要再来加引号,后面的分号也不需要,等号两边的空格也不需要。
在将阿里云OSS配置参数交给properties配置文件来管理之后,我们的AliOSSUtils工具类就变为以下形式:
/*** 使用阿里云OSS进行文件存储的工具类*/
@Component
public class AliyunOSSUtils {/** 以下4个参数没有指定值(默认值:null)*//** 指定连接的阿里云OSS服务的地址 */private String endpoint;/** 阿里云OSS AccessKey */private String accessKeyId;private String accessKeySectre;/** 存储空间Bucket的名称 */private String bucketName;//省略其他代码...
}
而此时如果直接调用AliOSSUtils类当中的upload方法进行文件上传时,这4项参数全部为null,原因是因为并没有给它赋值。
此时我们是不是需要将配置文件当中所配置的属性值读取出来,并分别赋值给AliOSSUtils工具类当中的各个属性呢?那应该怎么做呢?
想法:IO流,通过IO流读取并解析配置文件当中配置项的值,然后再给成员变量赋值。
因为application.properties是springboot项目默认的配置文件,所以SpringBoot程序在启动时会默认读取application.properties配置文件,而我们可以使用SpringBoot提供一个的现成的注解:@Value,获取配置文件中的数据。
- @Value 注解通常用于外部配置的属性注入,具体用法为: @Value("${配置文件中的key}")
- 通过@Value注解进行属性注入,将外部的属性配置注入进来赋值给成员变量,在@Value注解当中来指定我们要注入的是配置文件当中的哪一个Key对应的属性值。
/*** 使用阿里云OSS进行文件存储的工具类*/
@Component
public class AliyunOSSUtils {/** 指定连接的阿里云OSS服务的地址 */@Value("${aliyun.oss.endpoint}")private String endpoint;/** 阿里云OSS AccessKey */@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;/** 存储空间Bucket的名称 */@Value("${aliyun.oss.bucketName}")private String bucketName;
}
总结:
- 如果在项目开发当中,我们需要用到一些技术或者是服务,我们就可以把这个技术或者是服务它在运行时所需要的参数直接配置在配置文件当中,交给配置文件进行统一的管理和维护,然后在程序当中我们就可以通过@Value注解来注入对应的外部配置的属性值。
4.2 yml配置文件
- 全新格式的配置文件 - yml配置文件
在SpringBoot项目当中,是支持多种配置方式的,前面我们一直使用SpringBoot项目创建完毕后自带的application.properties配置文件进行属性的配置,properties配置文件的配置形式就是键值对Key=Value,等号之前是Key,等号之后是Value,那其实呢,在SpringBoot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件,就是我们接下来要学习的yml格式的配置文件。
- yml格式的配置文件,它的后缀可以是yml(推荐),也可以是yaml,这两个配置文件它的配置形式都是相同的,仅仅是后缀名不同而已。
- 如果是yml格式的配置文件,配置文件的名字也必须叫做application.yml。
yml 格式的配置文件,后缀名有两种:
yml (推荐)
yaml
SpringBoot提供了多种属性配置方式 / SpringBoot所支持的配置文件
-
application.properties
server.port=8080 server.address=127.0.0.1
-
application.yml
server:port: 8080address: 127.0.0.1
-
application.yaml
server:port: 8080address: 127.0.0.1
- 可以看到,在SpringBoot当中所支持的这三种配置文件,配置文件的名字都是相同的,都叫applictaion,只是文件扩展名不同而已。
- 如果是yml格式的配置文件,它的配置形式是键值对Key:Value,而且这个Key还是按照层级书写的,相比于传统的properties格式,YAML格式的配置文件使用缩进和结构化语法来表示数据的层级关系。
- 层级结构:YAML配置文件使用缩进来表示层级关系,前面的缩进相同,代表它们的层级也相同。比如我们要配置服务器运行的端口号:server.port,
- 在上面的示例中,
port
、host
和timeout
是server
的子属性,它们位于不同的缩进级别。2. 键值对:YAML 使用冒号(
:
)来表示键值对。冒号后面是一个空格,然后是相应的值。
- 在上面的示例中,
url
、username
和password
是database
的子属性。3. 列表:YAML 支持表示列表数据的方式,使用短横线(
-
)表示列表中的项目。
- 在上面的示例中,
fruits
是一个包含三个元素的列表。4. 注释:使用井号(
#
)表示注释。井号后面的内容将被视为注释,不会被解析。
- 在上面的示例中,井号后面的内容是注释,不会影响配置的读取和解析。
这些是 YAML 配置文件的一些常见形式。通过使用缩进、键值对、列表和注释等语法规则,YAML 配置文件可以更清晰和易读地表示数据的结构和层级关系。
在SpringBoot的resources目录下来创建一份儿applictaion.yml格式的配置文件,创建后可以看到,在我们所创建出来的application.yml格式的配置文件前面多了一个SpringBoot的Logo,这就说明SpringBoot是识别这份配置文件的。
演示:输入server之后给出自动提示,我们要配置的是SpringBoot内嵌的Tomcat服务器运行的端口号,默认是8080,我们可以修改内嵌的Tomcat服务器端口号为9000:
常见的三类配置文件格式的优缺点对比:
- 在XML配置文件当中,我们要定义很多的标签,既要定义开始标签,又要定义结束标签,既有父标签,也有子标签,虽然层级结构比较清晰,但是配置比较臃肿;
- properties配置文件相对于XML配置文件来说,会更加轻量化一些,它的配置格式是键值对Key=Value,但是,在项目开发当中,我们经常会使用大量的框架以及第三方的技术,而在使用框架时,我们又需要在配置文件当中来配置很多的参数,而在框架当中,为了让这个Key更加的简明知意,并且具有一定的标识意义,所以这个Key通常来说都是分层级的,如果用properties配置文件来配置,那就是平铺直叙,层级结构并不清晰,而且这个Key越复杂,层级架构约不清晰,所以properties配置文件相对于XML配置文件来说,它会更加轻量化一些,但是它并没有XML配置文件结构清晰。
- 如果采用yml格式来配置,这个层级结构就会更加清晰,没有一点儿多余的配置,而且通过该配置结构可以更清晰的表示数据的结构和层级关系,完全以数据为中心,简洁,没有一点儿多余的配置。
在SpringBoot当中,仅支持properties和yml格式的配置,而在现在的企业开发当中,SpringBoot项目基本上采用的都是yml格式的配置文件,很少使用properties,所以,推荐使用yml格式的配置文件。
对于yaml格式的配置文件,我们一般会选择yml这个拓展名,更加简单。
我们可以看到配置同样的数据信息,yml格式的数据有以下特点:
- - 容易阅读
- - 容易与脚本语言交互
- - 以数据为核心,重数据轻格式
简单的了解过SpringBoot所支持的配置文件,以及不同类型配置文件之间的优缺点之后,接下来我们就来了解下yml配置文件的基本语法:
大小写敏感
数值前边必须有空格,作为分隔符
使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(对于现在的开发工具来说,使用Tab制表符或者空格无所谓,因为高级开发工具idea中会自动的将yml格式配置文件当中的Tab转换为空格)
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略
注解@ConfigurationProperties