系统配置文件
Spring Boot的系统配置文件,包括application.properties和application.yml配置文件的使用以及YML和Properties配置文件有什么区别,最后介绍如何更改Spring Boot的启动图案。
1.application.properties
Spring Boot支持两种不同格式的配置文件:一种是Properties,另一种是YML。Spring Boot默认使用application.properties作为系统配置文件,项目创建成功后会默认在resources目录下生成application.properties文件。该文件包含Spring Boot项目的全局配置。我们可以在application.properties文件中配置Spring Boot支持的所有配置项,比如端口号、数据库连接、日志、启动图案等。接下来将介绍在Spring Boot项目开发过程中与配置相关的一些知识。
(1)基本语法
Spring Boot项目创建成功后会默认resources目录下会自动创建application.properties文件。使用也非常简单,配置格式如下:
# 服务器端口配置
server.port=8081
在上面的示例中配置了应用的启动端口。如果不配置此项,则默认使用8080端口;如果需要使用其他端口,则通过server.port=8081修改系统启动端口。
此外,Properties文件中的配置项可以是无序的,但是为了保证配置文件清晰易读,建议把相关的配置项放在一起,比如:
以上示例将thymeleaf模板相关的配置放在一起,这样看起来清晰明了,从而便于快速找到thymeleaf的所有配置。
(2) 配置文件加载顺序
Spring Boot项目的配置文件默认存放在resources目录中。实际上,Spring Boot系统启动时会读取4个不同路径下的配置文件:
1)项目根目录下的config目录。
2)项目根目录。
3)classpath下的config目录。
4)classpath目录。
Spring Boot会从这4个位置全部加载主配置文件,这4个位置中的application.properties文件的优先级按照上面列出的顺序依次降低。如果同一个属性都出现在这4个文件中,则以优先级高的文件为准。
(3) 修改默认配置文件名
可能有人会问,项目的配置文件必须命名为application.properties吗?当然不是,我们可以通过修改项目启动类,调用SpringApplicationBuilder类的properties()方法来实现自定义配置文件名称。示例代码如下:
在上面的示例中,Spring Boot项目启动加载时默认读取更改名称的配置文件,即可修改默认加载的application.yml文件名。
2.application.yml
application.yml是以yml为后缀,使用YAML(YAML Ain’t a Markup Language)的配置文件。与XML等标记语言相比,YMAL结构更清晰易读,更适合用作属性配置文件。
(1)基本语法
YML基本语法为key:(空格)value的键值对形式,冒号后面必须加上空格。通过空格的缩进来控制属性的层级关系,只要是左对齐的一列数据,都是同一个层级的。具体格式如下:
在上面的示例中,自定义配置了系统的日志级别、文件路径等属性。可以看到logging下包含level和file两个子配置项。
YML文件虽然格式简洁直观,但是对格式要求较高,使用YML配置文件时需要注意以下几点:
1)属性值和冒号中间必须有空格,如name: Weiz正确,使用name:Weiz就会报错。
2)需要注意各属性之间的缩进和对齐。
3)缩进不允许使用tab,只允许空格。
4)属性和值区分字母大小写。
(2)数据类型
YML文件以数据为中心,支持数组、JSON对象、Map等多种数据格式,因此更适合用作配置文件。
(1)普通的值(数字、字符串、布尔值)
普通的数据通过k:v的键值对形式直接编写,普通的值类型或字符串默认不用加上单引号或者双引号。
当然,也可以使用双引号(“”)来转义字符串中的特殊字符,特殊字符转义后就表示它自身的意思,例如:
name: "zhangsan \n lisi"
上面的示例会输出:
zhangsan
lisi
使用单引号(‘’)不会转义特殊字符,所有字符都按照普通字符处理,作为字符串数据,例如:
name: 'zhangsan \n lisi'
上面的示例会输出:zhangsan \n lisi。“\n”字符作为普通的字符串,而不转义为换行。
(2)对象、Map(属性和值)
对象同样是以k:v的键值对方式展现的,只是对象的各个属性和值的关系通过换行和缩进方式来编写。示例代码如下:
person:
lastName: zhangsan
age: 20
如果使用行内写法,可以将对象的属性和值写成JSON格式,具体写法如下:
person: {lastName: zhangsan, age: 20}
(3)数组(List、Set)
数组是以- value的形式表示数组中的元素的,具体写法如下:
persons:
-zhangsan
-lisi
-wangwu
还可以采用行内写法,数组使用中括号的形式,具体写法如下:
persons: [zhangsan, lisi, wangwu]
我们可以看到,YML文件除了支持基本的数据类型之外,还支持对象、Map、JSON、数组等格式,这样可以在配置文件中直接定义想要的数据类型,无须额外转换。这也是程序员喜欢用application.yml的原因之一。
3.Properties与YML配置文件的区别
Spring Boot中的配置文件有Properties或者YML两种格式。一般情况下,两者可以随意使用,我们可以根据自己的使用习惯选择适合的配置文件格式。这两者完全一样吗?肯定不是,YML和Properties配置文件的区别如下:
1)YML文件以数据为中心,对于数据的支持和展现非常友好。
2)Properties文件对格式的要求没那么严格,而YML文件以空格的缩进来控制层级关系,对格式的要求比较高,缩进格式不对时容易出错。
3)Properties文件支持@PropertySource注解,而YML文件不支持。
4)YML文件支持多文档块的使用方式,使用起来非常灵活。
5)Properties配置的优先级高于YML文件。因为YML文件的加载顺序先于Properties文件,如果两个文件存在相同的配置,后面加载的Properties中的配置会覆盖前面YML中的配置。
4.实战:自定义系统的启动图案
我们知道Spring Boot程序启动时,控制台会输出由一串字符组成的Spring符号的启动图案(Banner)以及版本信息(见下图)。
Spring Boot自带的启动图案是否可以自定义呢?
答案是肯定的。下面通过示例来演示如何自定义Spring Boot的启动图案。
步骤01 在项目的resources目录下新建banner.txt,示例代码如下:
在上面的配置中,通过${}获取application.properties配置文件中的相关配置信息,如Spring Boot版本、应用的版本、应用名称等信息。
${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色,可以自定义,具体参考org.springframework.boot.ansi.AnsiColor。
${application.version}:用来获取MANIFEST.MF文件中的版本号,这就是在Application.java中指定SpringVersion.class的原因。
${application.formatted-version}:格式化后的{application.version}版本信息。
${spring-boot.version}:Spring Boot的版本号。
${spring-boot.formatted-version}:格式化后的{spring-boot.version}版本信息。步骤02 在application.properties中配置banner.txt的路径等信息。
步骤02 在application.properties中配置banner.txt的路径等信息。
在上面的配置中,在application中设置banner.txt文件的路径、应用的版本、Spring Boot的版本等信息。
步骤03 启动项目,查看修改之后的启动横幅图案是否生效,如图所示。
通过系统输出的启动日志可以看到,系统的启动图案已经变成我们自定义的样子,也就是Spring Boot的默认启动图案已经更改成自定义的启动图案。
Spring Boot也支持使用GIF、JPG和PNG格式的图片文件来定义横幅图案。当然,并不会把图片直接输出在控制台上,而是将图片中的像素解析并转换成ASCII编码字符之后再输出到控制台上。