目录
1. properties 是以键值的格式配置的,key 和 value 之间是用 等号 连接的;
2. yml 是树形结构的配置文件,基本配置语法是 “ key:value”,注:在key和value 之间是使用英文冒号和空格的方式来隔开的。
前言
上一篇文章介绍了Spring Boot 创建和使用后,还需要了解 Spring Boot 的配置文件,配置文件在整个 Spring Boot 中的作用也是很重要的,如果没有配置信息,此时的项目就不能连接和操作数据库,并且排查问题使用的一些日志也不能进行保存。
一、配置文件的作用
1. 连接数据库的配置信息(用户名和密码的配置) |
2. 整个项目启动之后的端口号 |
3. 用于定位问题的日志 |
4. 第三方系统的调用密钥等信息 |
二、配置文件的格式
Spring Boot 的配置文件分为两种模式:
- .properties
- .yml(.yaml) (一般通常用 yml 表示,是 yaml 的缩写)
1. properties
创建好一个 Spring Boot 项目之后,可以在 resource 目录下看到 一个配置文件,文件后缀名为 .properties 的配置文件,如下图:
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。
2. yml
另一种格式是 .yml 格式
说明:
1. properties 可以和 yml 配置文件同时存在域一个项目中,如果存在于一个项目中,当配置文件中设置了同样的配置参数,此时 .properties 配置文件的优先级最高,但是在加载完成 .properties 配置之后,也会继续加载 .yml 配置文件中的配置信息。
2. 在实际开发中,通常只会用一种配置文件,这样就可以更好的降低 代码的冲突。
三、两种配置文件的使用(语法格式)
1. properties 是以键值的格式配置的,key 和 value 之间是用 等号 连接的;
1.1 读取配置文件
启动项目之后可以看到此时的端口号是8084:
然后新建一个 TextController 类,加上注册路由的注解,最后写一个 sayHi 方法:
重启项目之后可以在浏览器中访问上图中注册的路由地址,运行结果如下图:
注:在企业中一个服务器可能会运行很多个程序,当 Spring Boot项目启动之后,默认的端口号是 8080,但是如果一台服务器中有很多个 Spring Boot 项目时,此时就不能所有的 Spring Boot 项目全部使用 8080 端口,所以就需要设置 配置文件中的端口。
1.2 properties 缺点:
上图所示:使用 .properties 配置文件 如果有相同的配置参数,并且有多级路径,此时需要重复写很多次 key,此时就产生了代码冗余,写起来不方便,但是如果使用 .yml 就解决了这个问题。
2. yml 是树形结构的配置文件,基本配置语法是 “ key:value”,注:在key和value 之间是使用英文冒号和空格的方式来隔开的。
2.1 yml 方式配置
上述代码已经在 .yml 配置文件中配置项目端口为 9990,此时可以看一下运行结果:
使用浏览器访问 sayHi 方法:
2.2 读取自定义配置
首先在 .yml 配置文件中写好自定义的配置,然后通过注解的方式主动读取 配置文件中的配置信息,最后在控制台进行输出:
如果在项目中主动读取配置文件中的内容,可以使用 @Value 注解来实现,@Value 注解中的参数使用 “${}” 的格式读取,如下代码所示:
package com.example.demo.controller;
import com.example.demo.enity.StudentComponent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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;
import javax.annotation.PostConstruct;
@Controller
@ResponseBody //加在类上表示当前类中的所有方法返回的都是非静态页面的数据
public class TextController {
@Value("${mystr1}")
private String mystr1;
@Value("${mystr2}")
private String mystr2;
@Value("${mystr3}")
private String mystr3;
@PostConstruct
public void doPostConstruct() {
System.out.println("----------------------");
System.out.println(mystr1);
System.out.println(mystr2);
System.out.println(mystr3);
System.out.println("----------------------");
}
}
运行结果:
注:三个参数中的 value 的不同的区别:如果一个字符串没有双引号什么都不加,此时就是所见即所得,如果是一个双引号,此时就是一个标准的字符串,会自动读取里边的换行符并识别; 如果是单引号,和什么都不加的效果是一样的。
因此只有加了双引号之后,才是一个标准的字符串的格式的参数。
2.3 配置对象
在yml 配置文件中不仅可以配置字符串参数,还可以配置对象:
在 yml 配置文件中 配置了对象信息之后需要有一个实体类来接收这个对象,因此先创建一个实体类:
package com.example.demo.enity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties("student")//读配置文件
@Component
@Setter
@Getter
@ToString
public class StudentComponent {
private int id;
private String name;
private int age;
}
此时主动读取配置文件中的信息就不能使用 @Value 注解了,需要使用@ConfigurationProperties 注解来完成对象的读取 ,括号中的参数就是配置信息中的对象的名称:studnet;之后要记得重写 ToString 方法,方便打印对象的信息:
@Value("${student.name}")
private String name;
@Autowired
private StudentComponent studentComponent;
@PostConstruct
public void doPostConstruct() {
System.out.println("name -> " + name);
System.out.println(studentComponent);
System.out.println();
}
注:在得到对象中的某个参数时,可以使用 @Value 注解,但是在读取配置文件中的对象时,需要使用@ConfigurationProperties 注解。
运行结果:
2.4 .yml 配置文件优点:
- yml 语法和 JSON 格式类似,写法简单,没有代码冗余,只需要写一次路径就可以将配置信息完成
- yml 支持更多的数据类型,可以配置字符串,数组,对象.... 适合用于数据结构的编辑,各种类型的配置文件
- yml 支持更多的编程语言,不只是 Java,在 Golang,PHP,Python 中也是支持 .yml 文件配置的
四、.properties VS yml
1. properties 是以 key=value 的形式配置的键值类型的配置文件, yml 使⽤的是类似 json 格式的 树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用 “: ” 英文冒号加空格的方式设置,并且空格不可省略。 |
2. properties 为早期并且默认的配置文件格式,但其配置存在⼀定的冗余数据,使用 yml 可以很好的 解决数据冗余的问题。 |
3. yml 通用性更好,支持更多的编程语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。 |
4. yml 支持更多的数据类型。 |