Spring Boot配置文件:properties 与 yml 的竞争

发布时间:2023年12月28日

在这里插入图片描述

在这里插入图片描述

💬 前言

本文,我们就要来介绍一下Spring Boot中的配置文件 ,在学习了本文之后,可以很清楚地知道如何在Spring Boot中去配置项目的一些系统设置

一、配置文件的说明

1、什么是配置文件

首先我们先来聊聊什么是配置文件?

  • 配置文件是一种 文本文件,通常用于存储程序的参数和设置。它包含了程序运行所需的各种选项和配置信息,例如界面风格、服务器连接信息、默认语言等。这些信息可以通过键值对的形式表示,也可以使用特定的语法和结构描述更复杂的配置信息。

  • 配置文件通常由 程序在启动时读取和解析,以自定义程序的行为。例如,在网站开发中,网站的配置文件通常包含了数据库连接信息、安全性设置、日志记录等重要信息。在操作系统中,配置文件则可以用于指定各种系统参数,如网络连接、设备驱动程序等。

  • 配置文件的格式和内容因程序而异,常见的配置文件格式包括INI文件XML文件JSON文件等。INI文件是最早的配置文件格式之一,它使用简单的键值对语法来存储配置信息。XML和JSON文件则更加灵活和可扩展,可以描述更复杂的配置信息

  • 除了使用传统的文本编辑器手动编写配置文件外,现在也有许多工具可以帮助用户轻松地编辑和管理配置文件。例如,一些应用程序具有自己的 配置文件编辑器,用户可以通过界面来直观地编辑配置信息。另外,一些配置管理工具则可以帮助用户 自动化地管理和维护配置文件,例如版本控制、备份和恢复等

2、配置文件的作用

知道了什么是配置文件之后,我们来看看它的作用有哪些

整个项?中所有重要的数据都是在配置?件中配置的,?如:

  • 数据库的连接信息(包含?户名和密码的设置);
  • 项?的启动端?;
  • 第三?系统的调?秘钥等信息;
  • ?于发现和定位问题的普通?志和异常?志等;

想象?下如果没有配置信息,那么 Spring Boot 项?就 不能连接和操作数据库,甚?是不能保存可以?于排查问题的关键?志,所以配置?件的作?是?常重要的?

我们可以来看看配置文件最简单的功能:修改服务器的启动端口号 对于默认的端口我们可以看到是8080

在这里插入图片描述

现在我们通过application.properties这个Spring Boot的配置文件将其修改为 9090

server.port=9090

在这里插入图片描述

然后在修改之后我们再去启动项目可以发现端口号被修改成为9090

在这里插入图片描述
💬 如果我们想要访问这个项目就不能使用 localhost:8080了,而要使用 localhost:9090 地址了

3、配置文件的格式

清楚了配置文件的作用之后,我们再来看看它的格式是怎样的

Spring Boot 配置?件主要分为以下两种格式:

  • .properties
  • .yml

在这里插入图片描述

这就好像连锁店??的统?服装?样,有两种不同的款式,properties类型的配置?件就属于?款“服饰”,也是创建 Spring Boot 项?时默认的?件格式(主要是由于仓库?还有库存),? yml 属于新版款式,如果?户了解情况直接指定要新款服饰,那么就直接发给他

那这两种格式有什么区别呢?我们来对比一下看看

  • properties文件
    • 出现的比较早
    • 出现中文的话出现乱码的几率非常大
  • yml文件
    • 出现的比较晚
    • 对中文的支持度是比较高
    • 在语法上,yml 配置格式相较于 properties 配置格式来说更加的简洁
  • 一些特殊说明
    • 理论上讲 .properties 可以和 .yml ?起存在于?个项?当中,当 properties 和 yml ?起存在?个项?中时,如果配置?件中出现了同样的配置,?如 properties 和 yml 中都配置了“server.port”,那么这个时候会 以 properties 中的配置为主,也就是 .properties 配置?件的优先级最?,但加载完 .properties ?件之后,也会加载 .yml ?件的配置信息。
    • 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取?种统?的配置?件格式(只会选一个存在),这样可以更好的维护(降低故障率)

二、.properties 配置文件

properties 配置?件是最早期的配置?件格式,也是创建 Spring Boot 项?默认的配置?件

1、properties 基本语法

我们先来看看它的基本语法:

  • properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
# 配置项?端?号
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

【小贴士】:

  1. 我们在配置文件中写注释是以#开头的
  2. 对于这配置文件里的配置项我们可以去做一个分类:
    • 系统配置项,比如server.port/spring.datasource.url... —> 系统
    • 用户自定义配置(非系统配置项)—> key 用户自定义
  3. 配置文件在项目重启再打开之后可能会出现乱码,涉及字符集的问题,这一块可以看我之前的文章 链接

2、读取配置文件

配置文件在写好之后不仅仅就好了哦,我们还可以去读取到里面的内容,一起来试试吧😁

👉 如果在项?中,想要主动的读取配置?件中的内容,可以使? @Value 注解来实现

# 用户自定义配置
javaclass=106
  • 以下是测试代码,我们一起来看看结果
@RestController
public class TestController {
    @Value("javaclass")
    private String myconfig;

    @RequestMapping("/test/sayhi")
    public String sayHi(){
        return "hello world ->" + myconfig;
    }
}
  • 可以看到,我们在页面中获取到的并不是 javaclass 所对应的value值,而是key值,这就使得很多同学产生了疑惑?

在这里插入图片描述

这里我们来谈谈value值正确的读取方法:@Value 注解使?“${}”的格式读取

  • 也就是要写成下面这样的形式👇
@Value("${javaclass}")    // 一定要是 ${key} 的格式
  • 然后我们再来访问读取一下看看便可以发现读取到了对应的value

在这里插入图片描述

  • 我们再来试试读取刚才所修改的读取服务器的启动端口
@Value("${server.port}")

在这里插入图片描述

3、properties 缺点分析

经过上面一系列的查看,我们来对properties 这个格式的文件来分析一下

  • 在这之前我们再去做一个测试,也就是 在properties文件 中写入中文的value值,然后去访问一下看看会有什么问题
mytest=测试properties文件
  • 然后重启项目去访问却发现我们并没有获取到这几个文字,而是出现了乱码的形式,只有英文properties可以看得清楚,而且这是在我的 IDEA配置文件已经设置了UTF-8的字符集之后

在这里插入图片描述

然后我们再根据两个不同是配置文件来看看它们之间的书写区别

在这里插入图片描述
在这里插入图片描述

于是我们便观察到了在properties文件中存在着很多重复的内容

在这里插入图片描述
💬 此时我们便可以得出properties文件的两个缺陷

  1. 如果在配置文件中出现中文的话,在访问时就会出现乱码问题
  2. properties 配置?件中会有很多的冗余的信息

三、.yml 配置文件

1、yml文件诞生的背景

那么这个时候,就轮到我们的.yml文件出场了,我们一起来看看它是怎么诞生的吧👈

  • 举一个很简单的例子,本专栏我们介绍的是【Spring Boot】,很多学习Java的同学相信一定听说过【Spring Cloud】,这个呢就是我们现在业界所称的 微服务,其实在早期 Spring Cloud 没出来的时候【Spring Boot】它就是一种微服务,那我们便可以来谈谈为什么要有微服务的出现呢?

    在这里插入图片描述

  • 原因就在于:随着团队的变大,不同业务部门有相同需求,所以要把原来的功能分成多个不同的模块。例如我们一个教育部门中的教务管理系统,原本在比较小型的时候之后一两个功能,那可以将这些模块都写在一起,但是当功能慢慢地增多,出现了:

    • 用户中心
    • 商城中心
    • 积分中心
  • 此时我们就要考虑到微服务了,将这些模块作为一个个功能给单独提取出来,便可以 实现很好地解耦,减少代码的维护成本

  • 而且在一个项目中,我们不仅仅只是使用到一门编程语言,可能会有多个,那么运维在进行维护的时候,可能会收到使用不同编程语言所描述的程序,这就会对运维的要求很高,所以需要一个通用的配置文件去解决这些问题 —— 此时就有了yml配置文件的诞生

我们来yml文件优点:

  1. yml 是?个可读性?,写法简单、易于理解,它的语法和JSON语?类似
  2. yml ?持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使?空?符号缩进和?量依赖外观的特?,特别适合?来表达或编辑数据结构、各种配置?件等
  3. yml ?持更多的编程语?,它不?是 Java 中可以使?在 Golang、PHP、Python、Ruby、
    JavaScript、Perl

2、yml 基本语法

了解了 yml文件的诞生背景以及其优点之后,我们来学习一下它的基本语法

  • yml 是树形结构的配置?件,它的基础语法是key: value,注意 key 和 value 之间使?英?冒号加空格的?式组成的,其中的空格不可省略

我们来看一下它的正确与错误配置格式:

在这里插入图片描述

使用yml格式的文件去连接MySQL数据库的代码如下:

spring:
 datasource:
     url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
     username: root
     password: 123456

3、yml 使用进阶

当然yml可不仅仅只有以下这些功能,我们再来进阶地学习一下

3.1 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: ~

3.2 yml 配置读取

yml 读取配置的?式和 properties 相同,使? @Value 注解即可分级目录下的内容读取不用 : 也是用.

① 普通读取

  • 首先的话我们来看看普通地去进行读取是怎么样的
@Value("${string.hello}")
private String hello;

在这里插入图片描述

② 特殊读取:value 值加单双引号

  • 字符串默认不?加上单引号或者双引号
  • 单引号会转义特殊字符,特殊字符最终只是?个普通的字符串数据
  • 双引号不会转义字符串??的特殊字符;特殊字符会作为本身想表示的意思

以下是测试代码:

mystr1: 你\n好      # 所见即所得
mystr2: '你\n好'    # 所见即所得
mystr3: "你\n好"    # 一一输出字符串内部的东西
@Value("${mystr1}")
private String mystr1;

@Value("${mystr2}")
private String mystr2;

@Value("${mystr3}")
private String mystr3;

@PostConstruct	// 在spring容器启动的时候执行, 可以做一些初始化的工作
public void doPostConstruct(){
    System.out.println("---------------------------------");
    System.out.println(mystr1);
    System.out.println(mystr2);
    System.out.println(mystr3);
    System.out.println(hello);
    System.out.println("---------------------------------");
}
  • 可以看到,在打印输出后我们可以看到面对默认字符串(中文不会有问题哦~)和 单引号字符串 就是打印原先的内容
  • 但是对于 双引号字符串 便不会转义字符串??的特殊字符,而是连\n也照样地打印出来,所以就出现了换行的现象

在这里插入图片描述

③ 读取配置对象

对于【配置对象】来说,我们不可以用@Value来读取配置中的对象,要使用另一个注解@ConfigurationProperties

  • 当对象随着SpringBoot的启动而启动时,发现有@ConfigurationProperties这个注解,那Spring就会知道有人让我去读取这个类,

我们现在配置文件中写入这个对象

# 配置对象的写入
student:
  id: 1
  name: zhangsan
  age: 18

然后我们去创建一个实体类进行测试,记得加上@Component@Data注解哦~

@ConfigurationProperties("student")
@Component  // 存对象:将当前的类托管给Spring, 此时就可以触发注解
@Data	// 获取到Get和Set方法
public class StudentComponent {
    private int id;
    private String name;
    private int age;
}

最后在TestController类中将 StudentComponent类 的对象通过@Autowired依赖注入交给Spring去管理

@Autowired	// 取对象:从Spring中去读取到对象
private StudentComponent studentComponent;

@PostConstruct
public void doPostConstruct(){
    System.out.println("---------------------------------");
    System.out.println(studentComponent);
}

在这里插入图片描述
④ 读取配置集合

# 配置集合的写入
dbtypes:
	name:
        - mysql
        - sqlserver
        - db2

或者是使??内写法(与上?的写法作??致):

dbtypes: {name: [mysql,sqlserver,db2]}

集合的读取和对象?样,也是使? @ConfigurationProperties 来读取的,具体实现如下:

@ConfigurationProperties("dbtypes")
@Component
@Data
public class ListConfig {
    private List<String> name;
}
@Autowired
private ListConfig listConfig;

System.out.println(listConfig.getName());

然后我们便可以看到,我们也顺利地读取到了集合中的所有对象:

在这里插入图片描述

💬 想要查看 Spring Boot 更多系统配置项,访问 官?


经典面试题:properties VS yml

接下去我们来看一道有关Spring Boot配置文件很经典的面试题:properties 与 yml 格式文件的区别

  • properties 是以 key=value 的形式配置的键值类型的配置?件,? yml 使?的是类似json格式的树形配置?式进?配置的,yml 层级之间使?换?缩进的?式配置,key 和 value 之间使?“: ”英?冒号加空格的?式设置,并且空格不可省略。
  • properties 为早期并且默认的配置?件格式,但其 配置存在?定的冗余数据,使? yml 可以很好的解决数据冗余的问题
  • yml 通?性更好,?持更多语?,如 Java、Go、Python 等,如果是云服务器开发,可以使??份配置?件作为 Java 和 Go 的共同配置?件
  • yml ?持更多的数据类型

附录

除了讲解上面的一些基础知识外,我们再来拓展延伸一下

Spring Boot 读取配置?件的 N 种?法

更多系统配置项

💬 再来讲一种企业里对于配置文件的定义是怎样的

  1. 创建不同环境的配置?件:
    • application.yml —— 主配置文件(存放的是公共的配置项)
    • application-dev.yml —— 开发环境
    • application-prod.yml —— 生产环境
    • application-test.yml —— 测试环境

给大家看看企业中的大项目都是怎样的,都是有多个配置文件的

在这里插入图片描述

  1. 在 application.yml 中设置运?环境

从上面企业级别的开发我们可以看出对于多个环境,它们的文件名大致是不变的,变的只是一些特殊的地方,我们只要注意这些就好了,以下是配置文件的命名规则:

① 必须有主配置文件,主配置文件名必须是 application.yml(.properties)
② 不同平台的配置文件,每个平台拥有一个配置文件,配置文件的名称有要求 application-xxx.yml

我们自己去模拟一下试试,这里先给出需求:

  • 开发环境端口号:6666
  • 测试环境端口号:7777
  • 生产环境端口号:8888

然后我们便根据这个规则去配置一下各个环境的启动端口号吧

# 配置application-dev.yml的启动端口号
server:
  port: 6666
# 配置application-dev.yml的启动端口号
server:
  port: 7777
# 配置application-dev.yml的启动端口号
server:
  port: 8888

最后我们去主的配置文件设置当前活跃的环境

spring:
  profiles:
    active:
      - dev

接下去我们重新启动项目来看看启动端口号是否发生了变化

在这里插入图片描述

然后我再将活跃的环境改为prod生产环境之后,启动端口号又发生了一些变化

spring:
  profiles:
    active:
      - prod

在这里插入图片描述
💬 以上就是我们对于企业当中配置文件的一些设置,读者可以自己去试试

四、总结与提炼

最后来总结一下本文所学习的内容📖

  • 首先我们先学习了一下什么是配置文件,以及它的作用与其在Spring Boot中的两种格式.properties.yml,总览地对比了一下两种文件格式有何不同
  • 接下去我们分开地去介绍了一下这两种文件:
    • 对于.properties文件来说,它虽然书写格式简单明确,不容易出错,但是呢存在着【乱码问题】和【冗余的信息】这两块缺点,所以我们推出了.yml文件
    • 对于.yml文件来说呢,它就有着很多的优点了:
      1. yml 是?个可读性?,写法简单、易于理解,它的语法和JSON语?类似
      2. yml ?持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使 ?空?符号缩进和?量依赖外观的特?,特别适合?来表达或编辑数据结构、各种配置?件等
      3. yml ?持更多的编程语?,它不?是 Java 中可以使?在 Golang、PHP、Python、Ruby、JavaScript、Perl
    • 那么对于.yml文件,我们还学习了一些进阶的内容,知道了如何去读取 普通内容、value 值加单双引号的内容、配置对象以及配置集合 这些
  • 然后我们看了一道经典的面试题:properties VS yml ,知道它们之间的区别在哪里了吗?
  • 在最后我们又介绍到了在企业当中配置文件在不同环境下如何去进行设置,三种环境分别是:application-dev.ymlapplication-prod.ymlapplication-test.yml

以上就是本文要介绍的所有内容,感谢您的阅读🌹🌹🌹

在这里插入图片描述

文章来源:https://blog.csdn.net/Fire_Cloud_1/article/details/135230138
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。