冰凌汇编

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 41|回复: 0
收起左侧

[网路配置] SpringBoot中幕——配置文件properties与yml

[复制链接]
Inspiring 发表于 2022-8-18 22:16:50
本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。
1.配置文件的作用
整个项目中所有重要的数据都是在配置文件中配置的,比如∶
  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志,
  • 还可以自定义配置,如配置上传文件的保存地址信息等。

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

配置文件分为两类与,一类是系统配置文件,这种配置的格式都是固定的,另外一种是用户自定义配置文件,用户可以随意地规定配置文件的格式。

2.配置文件格式
SpringBoot项目配置文件有两种,一种是出生较早的properties文件,还有另外一种比较新的yml文件。
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

其实properties文件与yml文件就是一个老实与新式的关系,就像小米6与小米12之间的关系一样,yml文件相比于properties文件做了一些优化,如yml文件天然支持中文字符,而properties文件默认是不支持中文字符的,如果不进行字符配置,输入中文字符就会乱码。

如何配置properties文件默认字符编码呢?过程如下图:

SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

当然,和配置国内源一样,还需要对新建项目设置做出相同的设置。
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

设置完成,记得把原来的那个配置文件删除,重新新建一个,毕竟已经存在的配置文件格式的编码仍然不是UTF8。
配置文件是存在与resources目录下的,对于SpringBoot项目默认的配置文件,配置文件名必须是application,即application.properties或application.yml文件,如果配置文件名不为application那就不能够被识别。
当application.properties或application.yml两个文件共存是,老式配置文件优先,也就是application.properties生效。


3.配置文件的使用方法
先介绍一个小插件,如果是IDEA专业版可以忽略,对于社区版IDEA来说,默认是没有配置文件的代码提示的,我们安装一个插件来提高我们的开发效率。
这款插件名字叫做spring tools,在IDEA插件安装页面搜索安装就行,毕竟在我之前的文章已经演示很多次如何安装第三方插件了,这里就不细说了。
当然,专业版的IDEA自带,不需要安装额外的插件。
3.1properties配置文件
基本语法:
[C] 纯文本查看 复制代码
# key与=与value之间不要加空格
key=value

栗子,设置端口号,我们可以使用规定设置端口号的server.port来设置:
[C] 纯文本查看 复制代码
server.port=8082

配置修改完毕后,启动程序,可以看到端口号已经设置成你配置文件所设置的端口号了。
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

有关更多系统的配置,了解官网的官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
注意!不要在所写的配置信息最后加空格!!!

我们知道配置文件的信息除了系统的配置,还可以自定义配置。
[C] 纯文本查看 复制代码
# 自定义配置信息
custom.name=张三
custom.id=1

那如何读取配置文件中的信息呢?读取配置文件中的信息,我们可以使用@Value注解来实现。
我们可以使用属性注入的方式来获取,当然也可以使用构造方法注入和Setter注入,我们以属性注入举例子, 获取规则

[Python] 纯文本查看 复制代码
@Value("${配置信息key}")
private String name;

样例:
[Python] 纯文本查看 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UseYml {
    @Value("${custom.name}")
    private String name;
    @Value("${custom.id}")
    private String id;
    @Value("${server.port}")
    private String port;
    @ResponseBody
    @RequestMapping("/yml")
    public String configuration() {
        return "name:" + name + "\n"
                + "id:" + id + "\n"
                + "port:" + port;
    }
}

页面获取结果:
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

3.2yml配置文件
3.2.1基本语法与使用
基本语法:
[C] 纯文本查看 复制代码
# :后面空格一定不能省
key: value

例如,将上述的propertise转换成yml格式如下:
[C] 纯文本查看 复制代码
server:
  port: 8082
# 自定义配置信息
custom:
  name: zhangsan
  id: 1

读取yml配置文件的方式与properties配置文件一样,代码都不用变。
yml的优点:
  • 语法简单,可读性高。
  • 支持更多数据类型。
  • 跨语言使用,Python,Go等语言都使用yml。
3.2.2yml中单双引号问题
关于yml单双引号问题:
我们将配置文件中的配置信息设置成如下字样:

[C] 纯文本查看 复制代码
mystring:
  str1: 你好\n配置
  str2: '你好\n配置'
  str3: "你好\n配置"

我们将这些配置信息注入到一个类,我们尝试来读取它们。
[Python] 纯文本查看 复制代码
@Controller
public class YmlString {
    @Value("${mystring.str1}")
    private String str1;
    @Value("${mystring.str2}")
    private String str2;
    @Value("${mystring.str3}")
    private String str3;
    @ResponseBody
    @RequestMapping("/str")
    public String mystr() {
        System.out.println("str1:" + str1);
        System.out.println("str2:" + str2);
        System.out.println("str3:" + str3);
        return str1 +"\n"
                + str2 + "\n"
                + str3;
    }
}

控制台输出结果:
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

这就说明,被双引号包裹的值,按照原语义执行,而被单引号包裹或不包裹的值会发生转义,像上面的例子就是\n转义成了\\n,所以就输出了\n。

3.2.3配置对象
对于yml配置文件,还能进行对象的设置,如设置一个Student对象:
方式1:

[Python] 纯文本查看 复制代码
student:
  id: 1
  name: 张三
  age: 18

方式2:
[C] 纯文本查看 复制代码
student: {id: 1,name: 张三,age: 18}

从配置文件读取自定义的对象,就不可以使用@Value注解来读取了,需要使用@ConfigurationProperties注解来进行对象的读取,并且对于的类必须有getter/setter方法。
示例:
学生类:

[Python] 纯文本查看 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
    private int id;
    private String name;
    private int age;
}

使用类:
[Python] 纯文本查看 复制代码
@Controller
public class ConfigController {
    @Resource
    private ConfigList configList;
    @RequestMapping("/list")
    @ResponseBody
    public String sayList() {
        System.out.println(configList.getName());
        return configList.getName().toString();
    }
}

运行结果:
SpringBoot中幕——配置文件properties与yml - Inspiring_冰凌汇编

小总结:properties与yml的区别
  • 语法不同
  • properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
  • yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
  • yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
  • yml支持更多的数据类型,如对象和集合。
冰凌汇编免责声明
以上内容均来自网友转发或原创,如存在侵权请发送到站方邮件9003554@qq.com处理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|站点统计|Archiver|小黑屋|RSS|冰凌汇编 ( 滇ICP备2022002049号 滇公网安备 53032102000029号)|网站地图

GMT+8, 2022-10-6 21:46 , Processed in 0.133436 second(s), 8 queries , Redis On.

冰凌汇编 - 建立于2021年12月20日

Powered by Discuz! © 2001-2022 Comsenz Inc.

快速回复 返回顶部 返回列表