2023.11.15 关于 Spring Boot 配置文件
目录
引言
Spring Boot 配置文件
properties 配置文件说明
基本语法
读取配置文件
优点
缺点
yml 配置文件说明
基本语法
读取配置文件
yml 配置不同数据数据类型及 null
字符串 加单双引号的区别
yml 配置 列表(List) 和 映射(Map)
yml 读取映射(Map)
读取映射(Map)
读取 映射+列表 组合
总结
properties 和 yml 配置文件的区别
不同环境中的配置文件
引言
Spring Boot 配置文件
- 主要是用来写 "系统配置文件"
- 例如 端口号设置、数据库连接设置、用户自定义配置文件 等
- 文件格式有两种
注意:
- properties 配置文件是最早的配置文件格式,也是 Spring Boot 项目的默认配置文件
- 如果在 properties 配置文件 和 yml 配置文件中出现了同样的配置
- 那么 Spring Boot 会以 properties 中的配置为主
- 因为 properties 配置文件的优先级最高
- 即 先加载完 properties 配置文件才会加载 yml 配置文件
- 虽然理论上 properties 配置文件 和 yml 配置文件可以共存,但通常会采取统一的配置文件格式
properties 配置文件说明
基本语法
- properties 是以键值对的形式进行配置的
- key 和 value 之间通过 " = " 连接
# 配置端口号 server.port = 8080# 配置数据库连接信息 spring.datasource.url = mysql://127.0.0.1:3306/test?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 1111# 用户自定义配置 myname = xiaolin
- 通过 "#" 给配置文件添加注释信息
- 关键字之间的 "." 为层次结构的分隔符,用于表示配置属性的层级关系
读取配置文件
- 通过 @Value 注解 加上固定格式 "${ }" 来读取配置文件
- 如果不使用固定格式,直接在()中写字符串,则直接将该字符串赋值给其标记的变量
- 此处我们读取上述文件中自定义配置的 myname 关键字
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;@Component public class ReadProperties {@Value("${myname}")private String name;@PostConstructpublic void printName() {System.out.println("我的名字是: " + name);} }
运行结果:
注意:
- @PostConstruct 是 Java 中的一个注解,它用于标记一个方法,在实例化一个对象后,该方法会在依赖注入完成后被自动调用
- 被 @PostConstruct 注解标记的方法不能有任何参数,并且不能声明为静态方法
优点
- 系统默认的配置文件
- properties 配置项的优先级比 yml 高
- 格式简单(key value 格式)、不容易出错
缺点
- 写法存在冗余信息
关于 properties 配置文件 的中文编码问题
- 当你在 properties 配置文件中,使用 # 加上了一些中文注释
- 那么可能会存在一个问题
- 当你将当前项目文件关闭之后,再次重新使用 IDEA 打开该文件时,你的中文注释可能会变为乱码
解决步骤
1. 打开当前项目的设置
2. 按下图所示更改配置
3. 配置 下次创建新文件项目 的设置
4. 重复第二步的操作
5. 删除原 application.properties 文件
6.重新再创建一个 application.properties 文件
- 输入 application.properties,敲击回车键 即可
yml 配置文件说明
- yml 格式可读性更高、写法更简洁、便于理解
- 支持更多的数据类型,如 清单(数组)、散列表、标记等数据形态
- 支持更多的编程语言,如 Java、Golang、PHP、Python、Ruby、JavaScript、Perl 等
基本语法
- yml 是树形结构的配置文件,它的基础语法是 "key:value"
- 注意 key 和 value 之间使用 英文冒号 + 空格 方式组成
- 空格一定不可省略!!
# 配置端口号 server:port: 8888# 连接数据库 Spring:datasource:url: mysql://127.0.0.1:3306/test?characterEncoding=utf8username: rootpassword: 1111
读取配置文件
- 与 properties 读取配置文件相同,使用 @Value 注解
- 此处读取上述配置的端口号
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component public class ReadYml {@Value("${server.port}")private Integer port;@PostConstructpublic void printPort() {System.out.println("配置的端口号是: " + port);} }
运行结果:
yml 配置不同数据数据类型及 null
# 字符串 string.value: nihao# 布尔值 true or false boolean.value1: true boolean.value2: false#整数 int.value1: 20 #二进制 int.value2: 0b1100_1110_1010_1000_1111#浮点数 float.value1: 2.716 #科学计数法 float.value2: 2716e-3# ~ 代表 null null.value: ~
字符串 加单双引号的区别
- 在 yml 中,不加引号的效果与加单引号的效果相同
- 均会将特殊字符自动转义成原始字符
- 双引号则区别于前面两者
- 即不会将特殊字符自动转义成原始字符,例如 \n 在双引号中表示换行
实例理解
- yml 中配置文件如下所示
string:str1: hello \n world!str2: 'hello \n world!'str3: "hello \n world!"
- 通过 @Value 注解分别读取
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component public class ReadYml {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void printString() {System.out.println(str1);System.out.println(str2);System.out.println(str3);} }
运行结果:
yml 配置 列表(List) 和 映射(Map)
# name list列表 name-list1:- 小林- 小王- 小美# name list列表 写法二(行内写法) name-list2: [小林,小王,小美]
- 上述示例中 name-list1 和 name-list2 是一个包含三个字符串的 元素列表(List)
- 其中 " - 小林 ","小林" 和 "-" 符号直接必须有空格,其他亦是如此
# student map映射 写法一 student1:id: 1name: xiaolinage: 20# student map映射 写法二 (行内写法) student2: {id: 1,name: xiaolin,age: 20}
- 上述示例中 student1 和 student2 是一个包含三个键值对的映射 (Map)
- 此处的 映射(Map) 可以简单理解为 yml 中的 student "对象"
# name map映射 + list列表 name-map3:class1:- 小林- 小王class2: 小美# name map映射 + list列表 写法二 (行内写法) name-map4: {class1: [小林,小王], stu2: 小美}
- 上述示例中 name-map3 和 name-map4 是一个 映射(Map),其包含两个键值对
- 键 class1 对应的值是一个列表(List),包含两个字符串元素:"小林" 和 "小王"
- 键 class2 对应的值是一个字符串 "小美"
# name list列表 + map映射 name-list3:- name: 小林age: 20- name: 小王age: 19# name list列表 + map映射 写法二 (行内写法) name-list4: [{name: 小林, age: 20}, {name: 小王, age: 19}]
- 上述示例中 name-list3 和 name-list4 是一个列表(List),其包含两个映射(Map)
- 每个映射(Map)都有 name 和 age 两个键值对
yml 读取映射(Map)
- 在 yml 配置文件中读取映射(Map)不能使用 @Value 注解
- 需使用 @ConfigurationProperties 注解来读取
- 此注解的参数是一个键值对形式,形如 prefix = "映射名称"
- 或不写键值对形式,直接写 映射名称 也 OK
- 该注解需要搭配与该映射相对应的实体类
- 该实体类有如下要求:
- 属性名必须要以 yml 配置中的 key 值一致
- 必须要有 setter 和 getter 方法,因为需要这两个方法初始化实体类对象
读取映射(Map)
实例理解
- 为了读取上述的 student1 映射(Map)
- 此处我们创建一个 Student 实体类
- 此处我们使用 LomBok 的 @Data 注解来提供 setter 和 getter 方法
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;//# student map映射 写法一 // student1: // id: 1 // name: xiaolin // age: 20//@ConfigurationProperties("student1") 写成该形式也是 OK 的 @ConfigurationProperties(prefix = "student1") @Component @Data public class Student {public int id;public String name;public int age; }
- 此处我们创建 ReadStudent 类来调用该实体类
import com.example.demo.enity.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component public class ReadStudent {@Autowiredprivate Student student;@PostConstructpublic void printStudent() {System.out.println(student.toString());} }
运行结果:
读取 映射+列表 组合
实例理解
- 先创建一个对应的 nameMap3 类,并在该类中定义一个用于存储列表的属性
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List;//# name map映射 + list列表 // name-map3: // class1: // - 小林 // - 小王 // class2: 小美@ConfigurationProperties("name-map3") //@ConfigurationProperties(prefix = "name-map3") @Component @Data public class NameMap3 {private List<String> class1;private String class2; }
- 再创建一个 ReadNameMap3 类来调用 nameMap3 类的属性 calss1 和 class2
import com.example.demo.enity.NameMap3; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;@Component public class ReadNameMap3 {@Autowiredprivate NameMap3 nameMap3;@PostConstructpublic void printNameList1() {System.out.println(nameMap3.toString());} }
运行结果:
总结
properties 和 yml 配置文件的区别
- 数据格式:properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,且 value 前的空格不可省略
- 数据类型:yml 支持更多的数据类型
- 通用性:yml 的通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份 配置文件作为 Java 和 Go 的共同配置文件
- 优化:properties 作为早期并默认的配置文件格式,存在一定的冗余数据,使用 yml 可以很好的解决冗余问题
不同环境中的配置文件
- 在实际工作中,一般会存在两种环境
- 分别为 生产环境 和 开发环境
- 针对这两种环境,我们需要使用不同的 yml 配置文件
- application-dev.yml (开发环境)
- application-prod.yml (生产环境)
- 此处的文件开头 "application-" 是固定的,其分隔符后可自定义名称
spring:profiles:active: dev
- 在 application.yml 配置文件中加上 该代码 便可实现运行 dev 即开发环境的配置文件
- 如果想运行 生产环境,将 dev 替换为 prod 即可
相关文章:

2023.11.15 关于 Spring Boot 配置文件
目录 引言 Spring Boot 配置文件 properties 配置文件说明 基本语法 读取配置文件 优点 缺点 yml 配置文件说明 基本语法 读取配置文件 yml 配置不同数据数据类型及 null 字符串 加单双引号的区别 yml 配置 列表(List) 和 映射(…...

2023年第九届数维杯国际大学生数学建模挑战赛A题
2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行,小云学长又在第一时间给大家带来最全最完整的思路代码解析!!! A题思路解析如下: 完整版解题过程及代码,稍后继续给大家分享~ 更多题目完整解析点…...

IDEA写mybatis程序,java.io.IOException:Could not find resource mybatis-config.xml
找不到mybatis-config.xml 尝试maven idea:module,不是模块构造问题 尝试检验pom.xml,在编译模块添加了解析resources内容依旧不行 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…...

1软件管理
2.1软件管理 一、Linux软件包管理机制 红帽系操作系统软件管理分类 yum rpm source bin 二、Rpm工具管理RPM软件包 1、认识RPM软件包 rpm软件包名称 软件名称 版本号(主版本、次版本、修订号) 操作系统 cpu平台 操作系统:el6 el5 fedora suse debin ubuntu cpu平台:i386 …...

flutter 绘制右上角圆角三角形标签
绘制: import package:jade/utils/JadeColors.dart; import package:flutter/material.dart; import dart:math as math;class LabelTopRightYellow extends StatefulWidget {final String labelTitle; // 只能两个字的(文字偏移量没有根据文字长度改变…...

C/C++输出整数部分 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C输出整数部分 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出整数部分 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个双精度浮点数f, 输出其整…...

通过20天预测7天
训练集和测试集如何划分,我如何知道期望和实际的对比。 当你希望通过过去20天的数据来预测未来7天时,你需要进行以下步骤: 1. **数据准备:** 将过去20天的数据整理成合适的格式,其中包括20天的特征和未来7天的目标。…...

【python】均值、中值和高斯滤波详解和示例
本文对均值、中值和高斯滤波进行详解,以帮助大家理解和使用。 这里写目录标题 均值滤波中值滤波高斯滤波核大小为(9,9)核大小为(51,51) 小结 下面是示例中使用的原图。 均值滤波 均值滤波是一种简单的平滑滤波器&…...

基于STM32的循迹小车项目实战
循迹小车是一种能够沿着预定路线行驶的智能小车,通过巡线传感器检测路面的线路,并根据检测结果调整行驶方向。本项目将基于STM32微控制器实现一个简单的循迹小车,通过学习和实践,帮助初学者熟悉STM32的开发流程和掌握循迹小车的实…...

Element UI 偶发性图标乱码问题
1. 问题如图所示 2. 原因:sass版本低 sass: 1.26.8 sass-loader: 8.0.2 3. 解决方法 (1) 提高sass版本 (2) 在vue.config.js中添加配置 css: {loaderOptions: {sass: {sassOptions: {outputStyle: expanded}}}},4. 遇到的问题 升级后打包,报错 Syntax…...

UniApp中的数据存储与获取指南
目录 介绍 数据存储方案 1. 本地存储 2. 数据库存储 3. 网络存储 实战演练 1. 本地存储实例 2. 数据库存储实例 3. 网络存储实例 注意事项与最佳实践 结语 介绍 在移动应用开发中,数据的存储和获取是至关重要的一部分。UniApp作为一款跨平台应用开发框架…...

VUE基础的一些实战总结
目录 创建一个 Vue 应用 步骤 1:安装 Node.js 和 npm 步骤 2:安装 Vue CLI 步骤 3:创建 Vue 项目 步骤 4:启动开发服务器 步骤 5:访问应用程序 步骤 6:编辑 Vue 应用 步骤 7:构建和部署…...

【算法】算法题-20231117
这里写目录标题 一、搜索插入位置(35)二、字符串相乘(43)三、两个相同字符之间的最长子字符串(1624)四、给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 一、搜索插入位置(35…...

轮播图(多个一起轮播)
效果图 class MainActivity : Activity(), Runnable {private lateinit var viewPager: ViewPagerprivate lateinit var bannerAdapter: BannerAdapterprivate val images ArrayList<Int>() // 存储图片资源的列表private val handler Handler() // 用于定时发送消息…...

OpenCV中的像素重映射原理及实战分析
引言 映射是个数学术语,指两个元素的集之间元素相互“对应”的关系,为名词。映射,或者射影,在数学及相关的领域经常等同于函数。 基于此,部分映射就相当于部分函数,而完全映射相当于完全函数。 说的简单点…...

如何快速搭建Spring Boot接口调试环境并实现公网访问
文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...

简单的用Python实现一下,采集某牙视频,多个视频翻页下载
前言 表弟自从学会了Python,每天一回家就搁那爬视频,不知道的以为是在学习,结果我昨天好奇看了一眼,好家伙,在那爬某牙舞蹈区,太过分了! 为了防止表弟做坏事,我连忙找了个凳子坐下&…...

【手撕数据结构】二分查找(好多细节)
🌈键盘敲烂,年薪30万🌈 目录 普通版本的二分查找: right只负责控制边界(少了两次比较): 时间复杂度更稳定的版本: BSLeftmost: BSRightmost: 普通版本的二分查找: …...

Python+Selenium WebUI自动化框架 -- 基础操作封装
前言: 封装Selenium基本操作,让所有页面操作一键调用,让UI自动化框架脱离高成本、低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试小白都能编写并实现自动化。 知识储备前提&a…...

PyCharm 【unsupported Python 3.1】
PyCharm2020.1版本,当添加虚拟环境发生异常: 原因:Pycharm版本低了!不支持配置的虚拟环境版本 解决:下载PyCharm2021.1版本,进行配置成功!...

flutter TabBar指示器
第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…...

PDF/X、PDF/A、PDF/E:有什么区别,为什么有这么多格式?
PDF 是一种通用文件格式,允许用户演示和共享文档,无论软件、硬件或操作系统如何。多年来,已经创建了多种 PDF 子类型来满足各个行业的不同需求。让我们看看一些最流行的格式:PDF/X、PDF/A 和 PDF/E。 FastReport .net下载 PDF/X …...

Microsoft发布了一份关于其产品安全修复的 11 月报告。
👾 平均每天有 50 多个漏洞被发现,其中一些会立即被网络犯罪分子利用。我们把那些现在很受网络犯罪分子欢迎,或者根据我们的预测,在不久的将来可能会被大量利用的漏洞称为趋势漏洞。 在攻击者开始利用这些漏洞之前 12 小时&#…...

12v24v60v高校同步降压转换芯片推荐
12V/24V/60V 高校同步降压转换芯片推荐: 对于需要高效、稳定、低噪音的降压转换芯片,推荐使用WD5030E和WD5105。这两款芯片都是采用同步整流技术,具有高效率、低噪音、低功耗等优点,适用于各种电子设备。 WD5030E是一款高效率…...

pip 问题
升级pip命令: python -m pip install --upgrade pippip不能下载pytorch: 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有,pip不会进行本地文件夹搜索。...

云计算(一):弹性计算概述
云计算(一):弹性计算概述 背景含义原理应用 背景 在实际场景中,经常会出现短时间内资源需求爆发式增长或长时间内资源需求不断增长,这时需要资源供给时刻满足需求的变化,保障业务正常运行。传统的供给方式…...

Qt/C++ 获取QProcess启动的第三方软件的窗体标题
Qt/C 获取QProcess启动的第三方软件的窗体标题,在使用EnumWindows获取窗体句柄(HWND)时,如果返回提前FALSE,则获取到的HWND状态IsWindow正常,但就是获取不到窗体标题。必须正常返回TRUE才能使用HWND获取到窗体标题,要不…...

Borland编辑器DOS系统快捷键应用
在项目中接触到DOS系统,该系统距离当下已经接近20年时间,网络上资源较少,因为需要用到C语言编辑器BorlandC,每次应用时难免会忘记快捷键使用,给使用造成很大的不便。 于是把现有收集的快捷键做出整理便于使用,供大家参…...

KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0
KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0 作者: 猫头虎博主 文章目录 KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0🐅摘要引言1. 迁移前的精心准备1.1 系统环境介绍1.2 深度数据验证1.2.…...

Golang抓包:实现网络数据包捕获与分析
介绍 在网络通信中,网络数据包是信息传递的基本单位。抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析。在Golang中,我们可以借助现有的库来实现抓包功能,进一步对网络数据进行分析和处理。 本文将介绍如…...