SpringBoot 配置文件

前言:

本篇主要介绍两种配置文件格式,分别为properties与yml(yaml)。

需要注意的是:

  1. 两个配置文件从功能上来讲是可以同时存在的,但是企业中通常会规定使用某一种格式的配置文件。
  2. 如果同一个配置出现在两种格式的配置文件中的话,那么以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 读取配置文件

3.2.1 @Value注解

如果在项目中,想要主动的读取配置文件中的内容,可以使用@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.2.2 @ConfigurationProperties注解

例如我们在利用OSS进行存储服务的时候,可以从yml配置文件中获取密钥的AK,SK,以及bucket。

后端可以通过 @ConfigurationProperties 注解获取,只需要填写前缀,并且设置成员属性的set方法才行,以下我们用Lombok注解代替:

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中设置指定要激活的配置文件的名称,如果需要激活多个配置文件的话,中间使用逗号分割。

(以下为伪代码,因为生产环境和测试环境的配置文件一波情况下,不会一起执行)

那什么情况下主配置文件需要一次性激活多个配置文件呢?

在一些复杂的应用场景下,可能需要使用多个配置文件来管理应用的配置信息,而这些配置文件中可能包含了相互依赖的配置项,需要同时加载才能正常运行。此时,主配置文件需要一次性激活多个配置文件,以确保应用的正常运行。例如,在一个大型分布式系统中,可能需要使用多个配置文件来管理各个组件的配置信息,而这些组件的配置项可能是相互依赖的,需要同时加载才能确保整个系统的正常运行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值