配置

  • 配置文件分类
  • yaml
  • 读取配置文件内容
  • profile (环境切换 dev、test、pro)
  • 内置配置加载顺序
  • 外部配置加载顺序

配置文件分类

由于 SpringBoot 贯彻 约定大于配置的思想 ,所以很多的配置 都有默认值,如果我们想自定义去指定我们想要的配置,我们就可以创建自己的配置文件 后缀格式有2种 但是文件名 只有一个 application

application.properties (键值对形式)

application.yml 或者 application.yaml(yml格式)

两者简单对比

properties 内容
spring.port=8080

yml 格式
spring:
  port: 8080

命名不同会导致加载顺序不同

Spring Cloud 中bootstartp 加载顺序优先于application 但是SpringBoot不识别这个规则

示例: bootstartp.properties > application.properties

三种applicaiton.后缀 加载顺序

properties > yaml > yml

即:如果 properties 中存在的配置 在 yaml 或者 yml 配置文件也有 那么就会优先使用 properties中的配置;如果 properties中没有的配置,那么就会在yaml、yml中进行读取。

详解 YAML

yaml 是一个配置文件格式 是以数据为核心,比xml更加简洁

YAML、XML、 Proprerties 对比

Properties 不容易看出 层级关系

XML 写起来要写标签 麻烦

YAML 优点多多

YAML语法

  • 区分大小写
  • 数据值前必须有空格,作为分隔符
  • 使用缩进表示层级关系
  • 缩进不认Tab 只认空格 切记( IDEA 可以按Tab)
  • # 表示注释
  • 缩进空格数不重要,只要同层级别元素左侧对齐即可

YAML的数据格式

  • 对象 map:键值对集合
person:
 name: zhangsan
 age: 20

#行内写法
persion: {name: zhangsan,age: 20}
  • 数组
address:
 - beijing
 - shanghai

#行内写法
address: [beijing,shanghai]
  • 纯量
msg: 'hello \n world'  # 单引号 \n 不会被识别为换行
msg: "hello \n world"  # 双引号 \n 会被识别为换行

Yaml 参数引用

name: "zhangsan"

persion:
 name: ${name}  # 引用了 name 的值 zhangsan 了

读取配置文件的内容

配置文件的内容:一部分 会被Spring 自动识别,另一部分 不能自动获取,就需要我们自己手动获取了

我们获取文件值有3种方式

  • @value
  • Environment
  • @ConfigurationProperties

案例1 @value

例如 当前Yml 中有

name: "zhangsan"

我们获取 就需要获取

@value("${name}")
private String name;

这里说一个事情 打死你都获取不了,static是干嘛的?优先加载,final是干嘛的,都会导致你无法获取值,切记,切记 不能加static 也不能加final 也不能同时加
@value("${name}")
private static final String name1;

关于数组处理:yml

persion:
 address: [beijing,shanghai]
@value("${persion.address[0]}")
private static final String name1;  //beijing

常量跟对象是一样的,只是区分了’A \n B’ ,”A \n B” 的单双引号区别

案例2 Environment

yml中有:

name: "zhangsan"
@Autowired
private Environment env;


使用就是
String name = env.getProperties("name");

案例3 @ConfigurationProperties

yml 中有

name: "libai"

persion:
 name: "zhangsan"
 age: 18

创建一个Persion 类 加入 下面的红色 内容即可 下面没写 构造方法 ,使用前,请自行添加。

@Component // 声明这是个Bean
@ConfigurationProperties
@Data
public class Persion{
  private String name;
 // libai
  private int age;
  // 0
}
@Component // 声明这是个Bean
@ConfigurationProperties(prefix = "persion") // 可以选择括号内容 是否填写
@Data
public class Persion{
  private String name; // zhangsan
  private int age; // 18
}

讲解一下 prefix 即 前缀,将来赋值属性的时候 就会拼接上去 即找XXX的时候就会去找persion.XXX

终了

然后说明一个依赖 可以增加 yml 的提示功能

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

Profile 环境选择

profile 配置方式

  • 多profile文件
  • yml多文档方式

profile 激活使用 不激活 不会去使用

  • 配置文件
  • 虚拟机参数
  • 命令行参数

如果配置文件 没有被启用激活 在SpringBoot项目启动的时候,一般来说第二行就会出现

2021-02-06 09:45:55.709  INFO 22520 --- [           main] com.giant.shop1688application            : No active profile set, falling back to default profiles: default

简单的看信息 也能看出来,没有设置profile,回去使用默认的 profile

实验1

在resources中配置 4个文件

文件1:application.properties

文件2:application-dev.properties 指定端口 8081

文件3:application-test.properties 指定端口 8082

文件4:application-pro.properties 指定端口 8083

在applicaiton.properties中使用

spring.profiles.actice=pro

那么就会指定启动配置文件 application-pro.properties 所以启动端口是8083