SpringBoot基础(二):配置文件详解

冬天vs不冷 2024-08-31 11:05:02 阅读 96

SpringBoot基础系列文章

SpringBoot基础(一):快速入门

SpringBoot基础(二):配置文件详解


目录

一、配置文件分类二、配置文件优先级1、不同版本优先级2、不同位置优先级

三、配置文件格式1、yml和yaml格式1.1、字符串1.2、布尔类型1.3、整数型1.4、浮点型1.5、空(Null)1.6、时间类型1.7、对象(属性和值)、Map(键值对)1.8、数组、list、set1.9、对象数组、对象list、对象set

2、properties格式

四、临时属性设置1、临时属性2、自定义配置文件

五、配置文件数据读取1、读取单一数据2、读取全部数据3、读取对象数据4、配置文件内的数据引用

六、多环境开发1、yml单一文件版2、yml多文件版3、yml独立配置多文件版

一、配置文件分类

SpringBoot提供了3种配置文件的格式

application.properties(传统格式/默认格式)

<code>server.port=81

application.yml(主流格式)

server:

port: 82

application.yaml

server:

port: 83

yml格式和yaml格式除了文件名后缀不一样,格式完全一样

二、配置文件优先级

1、不同版本优先级

springboot 2.4.0及以后版本:application.yaml ➡️ application.yml ➡️ application.propertiesspringboot 2.4.0以前版本:application.properties ➡️ application.yml ➡️ application.yaml旧版application.properties优先级最高,新版优先级最低不同配置文件中相同配置高优先级覆盖低优先级,不同配置文件中不同配置全部保留

2、不同位置优先级

classpath:application.yml(resources目录)【最低-程序员】classpath:config/application.yml(resources目录下的config目录)【项目经理】file :application.yml(jar包所在目录)【运维】file :config/application.yml(jar包所在目录下config目录)【最高-运维经理】

三、配置文件格式

1、yml和yaml格式

大小写敏感使用缩进表示层级关系,只允许使用空格(不允许使用Tab键)

缩进的空格数量不重要,只要相同层级的元素左侧对齐即可属性名与属性值之间使用冒号+空格作为分隔 #号 表示注释可使用-代替驼峰,如Java中的lastName,在yml中lastName或last-name都可正确映射

1.1、字符串

字符串可不用加单引号或双引号单引号不会转义【\n 则为普通字符串显示】双引号会转义【\n会显示为换行符】字符串可以拆成多行,换行符会被转化成一个空格|开头,大文本写在下层,保留文本格式,换行符正确显示

str1: 哈喽

str2: 哈喽

你好

str3: '哈喽 \n 你好'

str4: "哈喽 \n 你好"

str5: |

哈喽

你好

# 转为json样式如下

{ -- -->"str1":"哈喽","str2":"哈喽 你好 呀","str3":"哈喽 \\n 你好","str4":"哈喽 \n 你好","str5":"哈喽\n 你好"}

1.2、布尔类型

trueyeson皆为真,不区分每个字母大小写falsenooff皆为假,不区分每个字母大小写

flag1: true

flag2: False

flag3: yes

flag4: NO

# 转为json样式如下

{ "flag1":true,"flag2":false,"flag3":true,"flag4":false}

如果出现大写字母会提示异常,不过不影响

在这里插入图片描述

1.3、整数型

支持二进制、八进制、十六进制

<code>num1: 666

num2: 0001_0000 # 支持二进制、八进制、十六进制

# 转为json样式如下

{ -- -->"num1":666,"num2":4096}

1.4、浮点型

支持科学计数法

f1: 1.1

f2: 1.1e-2 # 使用科学计数法

# 转为json样式如下

{ "f1":1.1,"f2":0.011}

1.5、空(Null)

nullNull~都是空,不指定值默认也是空

str6: null

str7: Null

str8: ~

str9:

# 转为json样式如下

{ "str6":"","str7":"","str8":"","str9":""}

1.6、时间类型

java.util.Date类型

# date1: 2020-05-26 这样写会抛异常

date1: 2020/05/26

date2: 2020/05/26 01:00:00

# 转为json样式如下

{ "date1":1590422400000,"date3":1590426000000}

1.7、对象(属性和值)、Map(键值对)

java对象对应的yml设置属性

在这里插入图片描述

<code>person:

name: 张三

age: 30

# Map格式方式一

map1:

k1: v1

k2: v2

# Map格式方式二

map2: { -- --> key1: value1, key2: value2 }

# 转为json样式如下

{ "age":30,"map1":{ "k1":"v1","k2":"v2"},"map2":{ "key1":"value1","key2":"value2"},"name":"张三"}

1.8、数组、list、set

在这里插入图片描述

<code>person:

#数组格式一

subject:

- Java

- 前端

- 大数据

#数组格式二

likes: [王者荣耀,刺激战场]

# 转为json样式如下

{ -- -->"likes":["王者荣耀","刺激战场"],"subject":["Java","前端","大数据"]}

1.9、对象数组、对象list、对象set

在这里插入图片描述

<code>person:

# 对象数组格式一

pet1:

- type: dog

age: 1

- type: cat

age: 2

# 对象数组格式一

pet2:

- type: dog

age: 1

-

type: cat

age: 2

# 对象数组格式一

pet3: [{ -- -->type: dog, age: 1}, { type: cat, age: 2}]

# 转为json样式如下

{

"pet1":[{ "age":1,"type":"dog"},{ "age":2,"type":"cat"}],

"pet2":[{ "age":1,"type":"dog"},{ "age":2,"type":"cat"}],

"pet3":[{ "age":1,"type":"dog"},{ "age":2,"type":"cat"}]

}

2、properties格式

在这里插入图片描述

<code>person.name=李四

person.age=18

person.flag1=false

person.date1=2019/01/01

# map格式一

person.map1.key1=value1

person.map1.key2=value2

# map格式二

person.map2[k1]=v1

person.map2[k2]=v2

# 数组格式一

person.subject[0]=java

person.subject[1]=python

person.subject[2]=c++

# 数组格式二

person.likes=唱,跳,rap

# 数组对象格式

person.pet1[0].type=cat

person.pet1[0].age=1

person.pet1[1].type=dog

person.pet1[1].age=2

# 转为json样式如下

{ -- -->

"age":18,

"date1":1546272000000,

"flag1":false,

"likes":["唱","跳","rap"],

"map1":{ "key1":"value1","key2":"value2"},

"map2":{ "k1":"v1","k2":"v2"},

"name":"李四",

"pet1":[{ "age":1,"type":"cat"},{ "age":2,"type":"dog"}],

"subject":["java","python","c++"]

}

四、临时属性设置

1、临时属性

临时属性添加方式:java -jar 工程名.jar --属性名=值多个临时属性之间使用空格分隔

java –jar springboot.jar --server.port=80 --logging.level.root=debug

临时属性的加载优先级要高于配置文件的idea中Program arguments(程序参数)VM options (虚拟机参数)就是添加临时属性的

在这里插入图片描述

虚拟机参数一般用来设置<code>系统属性(不常用)程序参数一般用来设置应用程序选项或参数(常用)–server.port 选项应该在 java -jar 命令之后使用,而 -Dserver.port 选项应该在 -jar 命令前使用

# 以应用参数的方式

java -jar my.jar --server.port=7788

# 或以 JDK 参数的方式

java -Dserver.port=7788 -jar my.jar

2、自定义配置文件

方式一:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名

--spring.config.name=myApplication

方式二:使用临时属性设置配置文件路径或类路径,全路径名

--spring.config.location=classpath:/myApplication.yml

五、配置文件数据读取

1、读取单一数据

使用@Value可以读取单个数据,属性名引用方式:${一级属性名.二级属性名……}

@RestController

public class ReadConfigFile {

@Value("${server.port}")

private String myPort;

@RequestMapping("/getValue")

public String getValue(){

System.out.println(myPort);//8080

return "success";

}

}

2、读取全部数据

SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用getProperty方法获取

@RestController

public class HelloController {

@Autowired

private Environment environment;

@GetMapping("/hello")

public String hello(){

String personName = environment.getProperty("person.name");

String petType = environment.getProperty("person.pet1[0].type");

return "Hello,Spring Boot !";

}

}

3、读取对象数据

使用@ConfigurationProperties注解绑定配置信息到封装类中封装类需要定义为Spring管理的bean,否则无法进行属性注入

yml配置文件

person:

name: zhang3

age: 30

pets:

- type: dog

age: 1

- type: cat

age: 2

map:

k1: v1

k2: v2

属性注入的实体,使用时候直接@Autowired注入即可

@Data

@Component

@ConfigurationProperties(prefix = "person")

public class Person {

private String name;

private Integer age;

private List<Pets> pets;

private Map<String,String> map;

}

@Data

class Pets {

private String type;

private Integer age;

}

添加如下依赖,yml属性可以提示@ConfigurationProperties对应的实体的字段属性

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

4、配置文件内的数据引用

如文件属性内都具有相同的前缀

center:

dataDir: /usr/local/fire/data

tmpDir: /usr/local/fire/tmp

logDir: /usr/local/fire/log

msgDir: /usr/local/fire/msgDir

可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量

baseDir: /usr/local/fire

center:

dataDir: ${ baseDir}/data

tmpDir: ${ baseDir}/tmp

logDir: ${ baseDir}/log

msgDir: ${ baseDir}/msgDir

六、多环境开发

1、yml单一文件版

springboot 2.4.0以前版本

spring:

profiles:

active: dev #激活dev环境配置

---

spring:

profiles: pro

server:

port: 80

---

spring:

profiles: dev

server:

port: 81

---

spring:

profiles: test

server:

port: 82

springboot 2.4.0及以后的版本

spring.profiles为过时属性配置,不过也能使用替换属性为spring.config.activate.on-profile

spring:

profiles:

active: dev#激活dev环境配置

---

spring:

config:

activate:

on-profile: pro

server:

port: 80

---

spring:

config:

activate:

on-profile: dev

server:

port: 81

---

spring:

config:

activate:

on-profile: test

server:

port: 82

2、yml多文件版

application.yml主配置文件

spring:

profiles:

active: pro#激活pro环境

#其他公共属性

...

application-pro.yml生产环境配置文件

server:

port: 81

application-dev.yml开发环境配置文件

server:

port: 82

文件的命名规则为:application-环境名.yml主配置文件中设置公共配置(全局)环境分类配置文件中常用于设置冲突属性(局部)主配置文件属性和环境分类配置文件属性冲突,后者优先级高

3、yml独立配置多文件版

将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下

application-devDB.ymlapplication-devRedis.ymlapplication-devMVC.yml

SpringBoot2.4.0以前版本

使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔

spring:

profiles:

active: dev

include: devDB,devRedis,devMVC

相当于加载dev配置时,再加载对应的3组配置主环境最后加载

当主环境dev与其他环境有相同属性时,主环境属性生效其他环境中有相同属性时,最后加载的环境属性生效 如下展示加载顺序,最后加载的优先级最高(因为覆盖了相同的属性)

在这里插入图片描述

SpringBoot2.4.0及以后版本

比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次SpringBoot从2.4版开始使用<code>group属性替代include属性,降低了配置书写量

spring:

profiles:

active: dev

group:

"dev": devDB,devRedis,devMVC

"pro": proDB,proRedis,proMVC

"test": testDB,testRedis,testMVC

主环境最先加载

环境中有相同属性时,最后加载的环境属性生效 如下展示加载顺序,dev在第一位,相同属性会被覆盖

在这里插入图片描述

<code>总之:配置文件后加载的会覆盖先加载的配置文件属性内容



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。