Spring Boot之——配置文件

配置文件分类

目的:

  1. 掌握SpringBoot加载配置文件作用
  2. 掌握配置文件分类有两大类,如果同时存在会怎么样?

解析:

配置文件的作用:

  • 修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

  • SpringBoot官方讲解:约定 优于 配置 优于 编码

配置文件分类:

通过spring-boot-starter-parent依赖发现:

image-20210502231640928

配置文件是两大类:yaml和properties 配置文件

以端口号修改为例:

  1. 在resources目录下新建 application.properties 配置文件,添加端口号:

    1
    server.port=8081   # 修改tomcat端口

    启动项目发现端口修改为 8081

  2. 注释application.properties目录下端口设置,添加 application.yml配置文件

    1
    2
    server:
    port: 8082

    启动项目发现端口修改为 8082

  3. 如果把application.properties中的注释取消,即两种配置文件同时存在,启动项目发现项目的端口是 8081说明是application.properties配置文件生效

  4. 分别在application.properties和application.yml 里添加

    • company1=itheima、company2: itcast

      image-20210502233124402

    • 通过 @value注解注入读取配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @RestController
    public class HelloController {


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

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


    @RequestMapping("/hello")
    public String hello(){
    return " hello Spring Boot !" + company1 +" " + company2;
    }
    }

    访问浏览器:

    image-20210502233345342

    结论:

    两个配置文件同时都生效了,他们之间是取并集关系

小结:

  • 约定 优于 配置 优于 编码 #TODO
  • 两类配置文件如果同时存在,若 key 相同则 properties 优先级高,若key不同则合并

YAML介绍

目的:了解yaml是什么,有什么作用

YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。

非常适合用来做以数据为中心的配置文件

YAML基本使用

目的:掌握Yaml语法的基本数据类型的配置

步骤:

基本语法:

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • ‘’#” 表示注释,从这个字符一直到行尾,都会被解析器忽略。
  • 字符串无需加引号,如果要加,''""表示字符串内容 会被 转义/不转义

实现:

1、配置文件:

**对象(map)**:键值对的集合。

1
2
3
4
person:  
name: zhangsan
# 或者行内写法
person: {name: zhangsan}

数组:一组按次序排列的值

1
2
3
4
5
address:
- beijing
- shanghai
# 或者行内写法
address: [beijing,shanghai]

纯量:单个的、不可再分的值

1
2
msg1: 'hello \n world'  # 单引忽略转义字符
msg2: "hello \n world" # 双引识别转义字符

参数引用

1
2
3
name: lisi 
person:
name: ${name} # 引用上边定义的name值

2、使用 @value 读取配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//获取普通配置
@Value("${company1}")
private String company1;
//获取对象属性
@Value("${person.name}")
private String name;
//获取数组
@Value("${address[0]}")
private String address1;
//获取纯量
@Value("${msg1}")
private String msg1;
//获取纯量
@Value("${msg2}")
private String msg2;

YAML高级配置

目的:掌握自定义对象及成员属性是对象的数据类型

步骤:

  1. 定义实体类 Man和Woman
  2. 添加配置文件
  3. 依赖注入测试

实现:

1、定义实体类 Man和Woman

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.itheima.sh.pojo;

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

import java.util.Date;
import java.util.List;
import java.util.Map;

@Data
@ConfigurationProperties(prefix = "man")
public class Man {

private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private String[] address;
private List<String> addressList;
private Map<String, Object> hobbies; // 爱好
private Woman woman;
private List<Woman> wifes;
}
1
2
3
4
5
6
7
8
9
10
11
12
package com.itheima.sh.pojo;

import lombok.Data;

import java.util.List;
@Data
public class Woman {

private String userName;
private Integer age;
private List<String> addresses;
}

2、添加配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
server:
port: 8082

company2: itcast
company1: itheima


man:
userName: laowang
boss: true
birth: 1980/09/09 01:01:01
age: 41
address: [beijing, shanghai]
addressList:
- 北京
- 上海
- 深圳
hobbies:
sports:
- badminton
- basketball
musics:
- dj
- 23
woman:
userName: xiaohua
age: 20
addresses:
- 北京
- 上海
wifes:
- userName: xiaosan1
age: 25
addresses:
- 北京

- userName: xiaosan2
age: 20
addresses:
- 上海

3、依赖注入测试

方式1:引导类开启注解支持(推荐)

@ConfigurationProperties(prefix = “man”)+ @EnableConfigurationProperties(Man.class)

image-20210503001542063

方式2:@ConfigurationProperties(prefix = “man”)+@Component

image-20210503002259114

Controller编写代码测试:http://localhost:8082/getman

1
2
3
4
5
6
7
@Autowired
private Man man;

@GetMapping("getman")
public Man man() {
return man;
}

优化:将 Woman类放在 Man类中,作为内部类

image-20210503001903469

实现配置文件自动提示

目的:解决实体类配置文件 出现以下现象:image-20210503002632632

自定义的类和配置文件绑定一般没有提示。

步骤:

  1. 打开官网查看步骤

  2. 添加依赖实现自动提示

实现:

在pom文件中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--解决SpringBoot自定义配置提示问题-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

<!--插件运行时排除依赖-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

多环境切换

目的:profile是用来完成不同环境下,配置动态切换功能的

实现:

profile配置方式:

​ 多profile文件方式:提供多个配置文件,每个代表一种环境。

​ application-dev.properties/yml 开发环境

​ application-test.properties/yml 测试环境

​ application-pro.properties/yml 生产环境

image-20210503010721064

​ yml多文档方式(了解):

​ 在yml中使用 — 分隔不同配置

image-20210503011014412

profile激活方式

  • 配置文件: 再配置文件中配置:spring.profiles.active=dev
  • 虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
  • 命令行参数:java -jar XXX.jar –spring.profiles.active=dev

小结:

  • 实际开发使用 多profile形式,主要用于切换不同的环境,便于项目维护;

项目内部配置文件加载顺序

目的:掌握配置文件加载顺序问题

步骤:

1、查看官网,可以看出给了17种方式的配置加载形式

2、按照官网说明,添加配置实现

实现:

优先级:由高到底

  • file:./config/:当前项目下的/config目录下
  • file:./ :当前项目的根目录
  • classpath:/config/:classpath的/config目录
  • classpath:/ :classpath的根目录

项目外部配置文件加载顺序

目的:可以在jar包外修改配置文件

实现:

外部配置文件的使用是为了对能不文件的配合

  1. 命令行
1
java -jar app.jar --name="Spring“ --server.port=9000
  1. 指定配置文件位置
1
java -jar myproject.jar --spring.config.location=e://application.properties
  1. 外部不带profile的properties文件
1
2
classpath:/config/application.properties
classpath:/application.properties

小结:

  • 整体加载优先级: jar包外 到 jar包内

  • 如果jar和配置文件在同一级,配置文件会生效,会被自动的加载

  • 打包的时候 只会去打包classpath(src|main/resources)的配置文件,项目的根目录下的配置文件不会被打包到jar包中。

总结