JavaEE【Spring】:SpringBoot 配置文件

一、配置文件的作用

  • 配置数据库的连接信息(root / password)
  • 项目的启动端口(端口号)
  • 第三⽅系统的调⽤秘钥等信息(身份校验)
  • 配置日志的级别

二、配置文件的格式

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

  • .properties
  • .yml

如图所示:
在这里插入图片描述

1、注意

我们上一节提到过:在 Spring Boot 中是约定大于配置。那么在配置文件这块,约定就是文件名一定是 application 才行。

例如:我们将 配置文件改为 -> applications

  1. 配置文件内容就是修改端口号为 9090
server.port=9090
  1. 运行结果为:
    • 配置文件名为 application.properties:
      在这里插入图片描述
    • 配置文件名为 applications.properties:
      在这里插入图片描述

从上面的例子,我们可以看出 Spring Boot 只能识别 applications.properties/.yml 的配置文件

2、说明

举例:
在这里插入图片描述
.properties 配置如下:

server.port=9090

.yml 配置如下:

server:
  port: 9091

运行结果为:
在这里插入图片描述

上述结果说明:

  • .properties 和 .yml 可以共存,但是 .properties 配置⽂件的优先级最⾼;即如果 .properties 和
    .yml 中出现了相同的配置,会以 .properties 为主。
  • Spring Boot 在加载配置过程中,加载完.properties ⽂件之后,也会加载 .yml ⽂件的配置信息。
  • 在实际业务中,我们通常会以一直方式来配置文件,这样可以降低错误率。

三、properties 配置文件说明

1、基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,例如:

# 设置端口号
server.port=9090
# 设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

# 用户自定义配置项
mykey.key1=wzr
mykey.key2=zyf

2、读取配置文件

@Value 注解使用“${}”的格式读取,代码如下:

@RestController
public class TestController {
    
    

    @Value("${mykey.key1}")
    private String mykey;

    @RequestMapping("/hikey")
    public String HiKey(){
    
    
        return "Hi," + mykey;
    }
}

运行结果为:
在这里插入图片描述

① 注意

这里必须 使用 “${}” 的格式读取,否则就会读取失败,举例:

@RestController
public class TestController {
    
    

    @Value("mykey.key1")
    private String mykey;

    @RequestMapping("/hikey")
    public String HiKey(){
    
    
        return "Hi," + mykey;
    }
}

运行结果为:
在这里插入图片描述
这是因为,在 Spring Boot 中 约定大于配置,我们约定好 @Value 注解使用“${}”的格式读取到key 对应的 value 值,否则只会把它作为一个字符串赋值给 mykey.key1,而不是读取 mykey.key1 对应的 value 值。

3、优缺点

  • 优点:写法简单,不易出错
  • 缺点:写法不够灵活,有很多的冗余的信息,如数据库配置中同样的前缀要写很多次:
    在这里插入图片描述

这个缺点就需要 .yml 配置文件来解决了。

四、yml 配置文件说明

yml 是 YAML(Yet Another Markup Language)的缩写。

yml 的优点:

  • 可读性高,写法简单;
  • 支持更多的数据类型,还可以表示 数组、散列表、标量等数据结构;
  • 支持更多的编程语言,除去 Java,yml 还支持 Golang、Python、PHP、JavaScript等。

1、基本语法

格式:注意冒号后边有空格!!!

# 设置端口号
server:
  port: 9090
# 设置数据库的连接信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
    username: root
    password: 123456
    
# 用户自定义配置项
mykey2: wzr....

2、yml 使用进阶

① yml 配置不同数据类型及 null

Ⅰ. yml 配置读取

yml 读取和 properties 相同,代码如下:

@RestController
public class TestController {
    
    

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

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        return "Hi," + mykey2;
    }
}

运行结果为:
在这里插入图片描述

Ⅱ. 练习

使⽤代码测试⼀下,读取值为 null 的配置和根本不存在的配置结果是否⼀致?

a. 值为 null 的配置

yml 配置文件:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
mykey3:
  nullkey: ~

测试代码:

@RestController
public class TestController {
    
    

    @Value("${mykey3.nullkey}")
    private String nullkey;

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        return "Hi," + nullkey;
    }
}

运行结果为:
在这里插入图片描述

b. 根本不存在的配置

我们只需要改一下测试接口:

@RestController
public class TestController {
    
    

	@Value("${mykey3.nokey}")
    private String nokey;

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        return "Hi," + nokey;
    }
}

运行结果为:
在这里插入图片描述
很明显报错了,这也可以看出,值为 null 与 不存在 是两回事,要注意区分。

Ⅲ. string 类型的引号问题

在 yml 中,字符串默认不加 引号,加上可表示特殊含义。

举例:
配置文件:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
mykey3:
  s1: wzr \n zyf
  s2: 'wzr \n zyf'
  s3: "wzr \n zyf"

测试代码为:

@RestController
public class TestController {
    
    

   	@Value("${mykey3.s1}")
    private String s1;

    @Value("${mykey3.s2}")
    private String s2;

    @Value("${mykey3.s3}")
    private String s3;

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        System.out.println();
        System.out.println("s1:" + s1);
        System.out.println();
        System.out.println("s2:" + s2);
        System.out.println();
        System.out.println("s3:" + s3);
        System.out.println();
        return "s1:" + s1
                + " | s2:" + s2
                + " | s3:" + s3;
    }
}

运行结果为:
在这里插入图片描述

结论:

双引号可以使得 特殊字符 发挥其作用。

② 配置对象

Ⅰ. 配置

配置对象的方式有两种:

  • 原始写法
  • 行内写法
# 原始写法
users:
  id: 1
  name: wzr
  age: 19
# 行内写法
users2: {
    
    id: 2,name: zyf, age: 19}

Ⅱ. 读取

配置:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
users:
  id: 1
  name: wzr
  age: 19

实体类:

@ConfigurationProperties(prefix = "users")
@Component
public class Users {
    
    
    private int id;
    private String name;
    private int age;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

@RestController
public class TestController {
    
    

    @Autowired
    private Users users;

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        return users.toString();
    }
}

运行结果为:
在这里插入图片描述

Ⅲ. 注意事项

a. 实体类中不能没有 setter 方法

从配置文件中读取的实体类,实体类中不能没有 setter 方法

举例:
在实体类中,注释掉一个 setter 方法。

@Component
@ConfigurationProperties(prefix = "users")
public class Users {
    
    
    private int id;
    private String name;
    private int age;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

//    public void setAge(int age) {
    
    
//        this.age = age;
//    }

    @Override
    public String toString() {
    
    
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果为:
在这里插入图片描述

这是因为这里的 @ConfigurationProperties 注解是通过 setter 将配置文件中的内容赋值的。

b. 不能省略类注解

@ConfigurationProperties 注解需要搭配类注解使用。

举例:
在实体类中,注释掉类注解

package com.example.springbootdemo.model;

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

//@Component
@ConfigurationProperties(prefix = "users")
public class Users {
    
    
    private int id;
    private String name;
    private int age;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果为:
在这里插入图片描述

这里是因为,在 Spring 中,我们需要先将 Bean 注入,否则无法启动项目。

③ 配置集合

Ⅰ. 配置

配置对象的方式有两种:

  • 原始写法
  • 行内写法
# 原始写法
myList:
  name:
    - wzr
    - zyf
# 行内写法
myList2: {
    
    name: [wzr,zyf]}

Ⅱ. 读取

配置:

# 设置端口号
server:
  port: 9090
# 用户自定义配置项
myList:
  name:
    - wzr
    - zyf

实体类:这里的 @Data 注解就为我们提供了 getter 和 setter 方法

@Component
@ConfigurationProperties(prefix = "mylist")
@Data
public class MyList {
    
    
    private List name;
}

测试类:

@RestController
public class TestController {
    
    

    @Autowired
    private MyList myList;

    @RequestMapping("/hikey")
    public String HiKey() {
    
    
        return myList.getName().toString();
    }
}

运行结果为:
在这里插入图片描述

五、问题

1、properties 乱码问题

① 现象

在这里插入图片描述

② 解决

原因:配置文件不支持中文
在这里插入图片描述
解决方法:File -> settings
在这里插入图片描述

2、多平台环境的配置文件

① 问题

在日后的工作中,我们可能对于一个项目需要经过 测试,开发,生产 等等多种环境,这些环境的某些配置可能不相同,但是我们又不想每次更换环境的时候重写配置文件,那怎么办呢?

② 解决

通过 spring.profiles.active 来选择环境配置,我们将不同环境配置写好,然后在使用时只需要选择环境即可。
在这里插入图片描述

六、对比

  • properties
    1. properties 是以 key=value 的形式配置的键值类型的配置⽂件
    2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据
  • yml
    1. yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置文件
    2. 使⽤ yml 可以很好的解决数据冗余的问题
    3. yml 通⽤性更好,⽀持更多语⾔
  • 两者虽然能共存,但建议只使用一种

猜你喜欢

转载自blog.csdn.net/WZRbeliever/article/details/128268735