前言:
本篇主要介绍两种配置文件格式,分别为properties与yml(yaml)。
需要注意的是:
- 两个配置文件从功能上来讲是可以同时存在的,但是企业中通常会规定使用某一种格式的配置文件。
- 如果同一个配置出现在两种格式的配置文件中的话,那么以properties为主。
目录
一、配置文件的作用
二、配置文件的格式
三、properties配置文件说明
3.1 properties基本语法
3.2 读取配置文件
3.3 properties缺点分析
四、yml配置文件说明
4.1 yml基本语法
4.2 读取配置文件
4.3 yml优点分析
4.4 yml配置不同数据类型及null
4.5 yml中的单双引号问题
4.6 yml配置对象
五、properties VS yml
六、设置不同环境的配置文件
一、配置文件的作用
整个项目中所有的重要的数据都是在配置文件中配置的,比如:
- 数据库的连接信息(包含用户名和密码的设置);
- 项目的启动端口;
- 第三方系统的调用密钥等信息;
- 用于发现和定位问题的普通日志和异常日志等。
配置文件可以定义应用程序的属性,日志,数据源等各种方面的配置。在应用程序启动时,SpringBoot会自动加载并解析这些配置文件,并将配置信息注入到应用程序的各个组件中。
二、配置文件的格式
Spring Boot 配置文件主要分为以下两种格式:
- .properties
- .yml
如下图所示:
其中properties文件于yml就是一个旧版本和新版本的区别,就像小米6和小米13一样,yml文件相比于properties文件做了一些优化,如yml文件天然支持中文字符,而properties文件默认不支持中文字符,如果不进行字符配置的话,那么输入的中文字符就会乱码。
如何配置properties文件默认字符编码呢?
过程如下图所示:
需要注意的是:设置两个Settings,一个是当前项目的配置文件,另一个是所有新项目的配置文件:
在设置完成后需要删除原先的application.properties,创建一个新的application.properties。
说明:
- 理论上讲properties可以和yml一起存在于一个项目中,当properties和yml一起存在一个项目中时,如果配置文件中出现了同样的配置,比如properties和yml中都配置了”server.port“,那么这个会以properties中的配置为主,也就是.properties配置文件的优先级最高,但加载完.properties文件之后,也会加载.yml文件的配置信息。
- 虽然理论上来讲.properties可以和.yml共存,但在实际业务中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。
三、properties配置文件说明
properties配置文件是最早期的配置文件格式,也是创建Spring Boot项目默认的配置文件。
3.1 properties基本语法
properties是以键值的形式配置格式,key 和 value 之间是以”=“ 连接的,如:
# 配置项⽬端⼝号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=
utf8
spring.datasource.username=root
spring.datasource.password=root
在配置文件中,使用”#“来添加注释信息。
3.2 读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用@Value注解来实现,@Value注解使用”${}“的格式读取,如下代码所示:
package com.example.demo.component;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadProperties {
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("Read Properties:" +port);
}
}
@Component在String Boot启动时候会注入到框架中,注入到框架中时会执行@PostConstruct初始化方法,这个时候就能读取到配置信息了。
3.3 properties缺点分析
properties配置是以key-value的形式配置的,如下图所示,缺点显而易见,书写代码的时候可能会产生许多冗余的代码:
这也因如此,才有了yml配置文件的产生。
四、yml配置文件说明
yml是YAML的缩写,其全称为 Yet Another Markup Language 翻译成中文——"另一种标记语言"。
4.1 yml基本语法
基本语法为"key: value",注意这里key和value之间使用英文冒号+空格的方式组成的,其中的空格不可省略。
小提示:观察以下代码,其中红色方框中的第一项是错误的实例,于是key就没有高亮提示,而第二项由于是正确的格式,所以有高亮提示。
4.2 读取配置文件
读取yml配置文件的方式与properties配置文件一样,代码无需做出改变。
4.3 yml优点分析
- 可读性高
- 支持更多数据类型
- 可以跨语言使用,Python,Go等语言都使用yml
4.4 yml配置不同数据类型及null
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~
4.5 yml中的单双引号问题
配置文件代码如下:
我们将这些配置信息注入到一个类中,我们尝试来读取它们:
根据控制台的信息我们可以得出:
被双引号所包裹的值,按照原语义来执行,而被单引号包裹或不包裹的值会发生转义,像上面例子中就是 \n 被转义为\\n,所以就输出了\n。
这里的RestController是@Controller和@ResponseBody的组合注解,用于标记 一个类是SpringMVC的控制器并且默认返回JSON格式的响应结果。
4.6 yml配置对象
我们还可以在yml中配置对象,如下配置:
student:
id: 1
name: zhangsan
age: 19
或者使用 行内写法 也行,与上述代码作用相同:
这时不需要使用@Value来读取配置中的对象了,此时要使用另一个注解:@ConfigurationProperties来读取,具体实现如下:
package com.example.demo.component;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties("student")
@Setter
@Getter
@ToString
public class StudentComponent {
private int id;
private String name;
private int age;
}
利用@Autowired来读取StudentComponent类:
在控制台中打印如下:
需要注意的是,由于代码会在Spring启动的时候获取属性来设置这个类,所以Setter方法不能缺少,缺少就会报错,Getter和ToString方法根据具体情况分析。
五、properties VS yml
- properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂冒号加空格的⽅式设置,并且空格不可省略。
- properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的解决数据冗余的问题。
- yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置⽂件作为 Java 和 Go 的共同配置⽂件。
- yml ⽀持更多的数据类型。
更多的系统配置项可参考官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
六、设置不同环境的配置文件
我们知道,在企业的开发环境中,往往一个项目是需要多个配置文件的,因为需要在多种环境下来运行项目来完成相应的目的:开发环境下——开发配置文件,生产环境下——生产配置文件,测试环境下的——测试配置文件。
如下图所示:
一般我们会在主配置文件下,攥写开发环境、生产环境、测试环境中相同的代码,这样可以减少代码的冗余性。
可能有人问:这么多配置文件,那项目启动的时候,应该执行哪个呢?全部执行还是部分执行呢?
在SpringBoot项目中,如果有多个配置文件,如application-dev.yml、application-test.yml、application.yml、application-prod.yml等。其中application.yml为主配置文件。
当项目启动的时候,会根据激活的profile加载对应的配置文件,其中还会覆盖主文件中相同的配置项(在设计上,主文件不应该允许有跟其他配置文件相同的项),如果没有激活profile,则只会加载主配置文件。
可以通过spring.profiles.active中设置指定要激活的配置文件的名称,如果需要激活多个配置文件的话,中间使用逗号分割。
(以下为伪代码,因为生产环境和测试环境的配置文件一波情况下,不会一起执行)
那什么情况下主配置文件需要一次性激活多个配置文件呢?
在一些复杂的应用场景下,可能需要使用多个配置文件来管理应用的配置信息,而这些配置文件中可能包含了相互依赖的配置项,需要同时加载才能正常运行。此时,主配置文件需要一次性激活多个配置文件,以确保应用的正常运行。例如,在一个大型分布式系统中,可能需要使用多个配置文件来管理各个组件的配置信息,而这些组件的配置项可能是相互依赖的,需要同时加载才能确保整个系统的正常运行。