当前位置: 首页 > news >正文

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

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、set
      • 1.9、对象数组、对象list、对象set
    • 2、properties格式
  • 四、临时属性设置
    • 1、临时属性
    • 2、自定义配置文件
  • 五、配置文件数据读取
    • 1、读取单一数据
    • 2、读取全部数据
    • 3、读取对象数据
    • 4、配置文件内的数据引用
  • 六、多环境开发
    • 1、yml单一文件版
    • 2、yml多文件版
    • 3、yml独立配置多文件版

一、配置文件分类

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

  • application.properties(传统格式/默认格式)
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.properties
  • springboot 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、整数型

  • 支持二进制、八进制、十六进制
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设置属性

在这里插入图片描述

person:name: 张三age: 30# Map格式方式一map1:k1: v1k2: 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

在这里插入图片描述

person:#数组格式一subject:- Java- 前端- 大数据#数组格式二likes: [王者荣耀,刺激战场]# 转为json样式如下
{"likes":["王者荣耀","刺激战场"],"subject":["Java","前端","大数据"]}

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

在这里插入图片描述

person:# 对象数组格式一pet1:- type: dogage: 1- type: catage: 2# 对象数组格式一pet2:- type: dogage: 1-type: catage: 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格式

在这里插入图片描述

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 (虚拟机参数)就是添加临时属性的

在这里插入图片描述

  • 虚拟机参数一般用来设置系统属性(不常用)
  • 程序参数一般用来设置应用程序选项或参数(常用)
  • –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);//8080return "success";}
}

2、读取全部数据

  • SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用getProperty方法获取
@RestController
public class HelloController {@Autowiredprivate 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: zhang3age: 30pets:- type: dogage: 1- type: catage: 2map:k1: v1k2: 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/datatmpDir: /usr/local/fire/tmplogDir: /usr/local/fire/logmsgDir: /usr/local/fire/msgDir
  • 可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量
baseDir: /usr/local/fire
center:dataDir: ${baseDir}/datatmpDir: ${baseDir}/tmplogDir: ${baseDir}/logmsgDir: ${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
  1. 文件的命名规则为:application-环境名.yml
  2. 主配置文件中设置公共配置(全局)
  3. 环境分类配置文件中常用于设置冲突属性(局部)
  4. 主配置文件属性和环境分类配置文件属性冲突,后者优先级高

3、yml独立配置多文件版

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

SpringBoot2.4.0以前版本

  • 使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:profiles:active: devinclude: devDB,devRedis,devMVC
  • 相当于加载dev配置时,再加载对应的3组配置
  • 主环境最后加载
    • 当主环境dev与其他环境有相同属性时,主环境属性生效
    • 其他环境中有相同属性时,最后加载的环境属性生效
  • 如下展示加载顺序,最后加载的优先级最高(因为覆盖了相同的属性)

在这里插入图片描述

SpringBoot2.4.0及以后版本

  • 比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次
  • SpringBoot从2.4版开始使用group属性替代include属性,降低了配置书写量
spring:profiles:active: devgroup:"dev": devDB,devRedis,devMVC"pro": proDB,proRedis,proMVC"test": testDB,testRedis,testMVC
  • 主环境最先加载
    • 环境中有相同属性时,最后加载的环境属性生效
  • 如下展示加载顺序,dev在第一位,相同属性会被覆盖

在这里插入图片描述

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 序列建模之循环和递归网络 - 引言篇
  • 一个很牛的学习网站分享 Developer Roadmaps
  • 【视频讲解】顶级期刊即插即用模块代码共享计划·2024第一期:02:非相邻层次间语义信息渐进式特征融合策略(2024 1区Top | 浙江大学开源)代码实现
  • 【SpringMVC】详细介绍SpringMVC的执行流程
  • 基于JSP、java、Tomcat三者的项目实战--校园交易平台系统--(实习,答辩皆可用到)--万字爆更
  • Python酷库之旅-第三方库Pandas(075)
  • rabbitmq出现Management API returned status code 500 -
  • 用爬虫玩转石墨文档(下)
  • LeetCode_sql_day15(262.行程与用户)
  • Node.js 常用命令集合
  • Linux的Chrome、Firefox浏览器无法加载简书的图片
  • 算法第一天
  • 【Linux】解锁进程地址空间奥秘,高效环境变量的实战技巧
  • Elasticsearch 文档操作:增加、删除与查询
  • 白骑士的Matlab教学高级篇 3.4 App设计
  • @jsonView过滤属性
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Apache的80端口被占用以及访问时报错403
  • canvas 绘制双线技巧
  • Create React App 使用
  • go append函数以及写入
  • IndexedDB
  • iOS编译提示和导航提示
  • php中curl和soap方式请求服务超时问题
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云Kubernetes容器服务上体验Knative
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 那些年我们用过的显示性能指标
  • 时间复杂度与空间复杂度分析
  • 为视图添加丝滑的水波纹
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​ubuntu下安装kvm虚拟机
  • ![CDATA[ ]] 是什么东东
  • # SpringBoot 如何让指定的Bean先加载
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • ${factoryList }后面有空格不影响
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)Jupyter Notebook 下载及安装
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (笔试题)合法字符串
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (全注解开发)学习Spring-MVC的第三天
  • (学习总结16)C++模版2
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .gitignore
  • .Net7 环境安装配置