SpringBoot中幕——配置文件properties与yml

举报
未见花闻 发表于 2022/08/31 22:03:09 2022/08/31
【摘要】 本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。

⭐️前面的话⭐️

本篇文章将介绍有关SpringBoot的配置文件,SpringBoot的配置文件格式有两种,一种是项目中默认生成的properties文件,另外一种就是yml格式的配置文件,yml文件可以理解为properties文件的升级版,yml语法没有properties语法那么沉余,并且更通用。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年8月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《SpringBoot实战》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

1.配置文件的作用

整个项目中所有重要的数据都是在配置文件中配置的,比如∶

  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志,
  • 还可以自定义配置,如配置上传文件的保存地址信息等。

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

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

2.配置文件格式

SpringBoot项目配置文件有两种,一种是出生较早的properties文件,还有另外一种比较新的yml文件。

2

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

如何配置properties文件默认字符编码呢?过程如下图:
12
当然,和配置国内源一样,还需要对新建项目设置做出相同的设置。
13
设置完成,记得把原来的那个配置文件删除,重新新建一个,毕竟已经存在的配置文件格式的编码仍然不是UTF8。

配置文件是存在与resources目录下的,对于SpringBoot项目默认的配置文件,配置文件名必须是application,即application.propertiesapplication.yml文件,如果配置文件名不为application那就不能够被识别。

application.propertiesapplication.yml两个文件共存是,老式配置文件优先,也就是application.properties生效。

3.配置文件的使用方法

先介绍一个小插件,如果是IDEA专业版可以忽略,对于社区版IDEA来说,默认是没有配置文件的代码提示的,我们安装一个插件来提高我们的开发效率。

这款插件名字叫做spring tools,在IDEA插件安装页面搜索安装就行,毕竟在我之前的文章已经演示很多次如何安装第三方插件了,这里就不细说了。

当然,专业版的IDEA自带,不需要安装额外的插件。

3.1properties配置文件

基本语法:

# key与=与value之间不要加空格
key=value

栗子,设置端口号,我们可以使用规定设置端口号的server.port来设置:

server.port=8082

配置修改完毕后,启动程序,可以看到端口号已经设置成你配置文件所设置的端口号了。
3

有关更多系统的配置,了解官网的官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

注意!不要在所写的配置信息最后加空格!!!

我们知道配置文件的信息除了系统的配置,还可以自定义配置。

# 自定义配置信息
custom.name=张三
custom.id=1

那如何读取配置文件中的信息呢?读取配置文件中的信息,我们可以使用@Value注解来实现。

我们可以使用属性注入的方式来获取,当然也可以使用构造方法注入和Setter注入,我们以属性注入举例子, 获取规则:

@Value("${配置信息key}")
private String name;

样例:

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;
    }
}

页面获取结果:
111

3.2yml配置文件

3.2.1基本语法与使用

基本语法:

# :后面空格一定不能省
key: value

例如,将上述的propertise转换成yml格式如下:

server:
  port: 8082

# 自定义配置信息
custom:
  name: zhangsan
  id: 1

读取yml配置文件的方式与properties配置文件一样,代码都不用变。

yml的优点:

  • 语法简单,可读性高。
  • 支持更多数据类型。
  • 跨语言使用,Python,Go等语言都使用yml。

3.2.2yml中单双引号问题

关于yml单双引号问题:
我们将配置文件中的配置信息设置成如下字样:

mystring:
  str1: 你好\n配置
  str2: '你好\n配置'
  str3: "你好\n配置"

我们将这些配置信息注入到一个类,我们尝试来读取它们。

@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;
    }
}

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

3.2.3配置对象

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

方式1:

student:
  id: 1
  name: 张三
  age: 18

方式2:

student: {id: 1,name: 张三,age: 18}

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

示例:

学生类:

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;
}

使用类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ConfigController {
    @Autowired
    private Student student;

    @RequestMapping("/student")
    @ResponseBody
    public String sayStu() {
        System.out.println(student);
        return student.toString();
    }
}

运行结果:
333

3.2.4配置集合

配置文件还能配置集合,使用方法如下:

方式1:

dbtypes:
	name:
		- mysql
		- sqlserver
		- db2

方式2(推荐):

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

获取与对象的获取方式一模一样,只是现在类里面的一个属性为集合对象。

获取示例:
与配置文件对应的对象:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@ConfigurationProperties(prefix = "dbtypes")
@Component
public class ConfigList {
    private List<String> name;
}

使用类:

@Controller
public class ConfigController {
    @Resource
    private ConfigList configList;
    @RequestMapping("/list")
    @ResponseBody
    public String sayList() {
        System.out.println(configList.getName());
        return configList.getName().toString();
    }
}

运行结果:
555


小总结:properties与yml的区别

  • 语法不同
  • properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
  • yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
  • yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
  • yml支持更多的数据类型,如对象和集合。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。