SpringBoot 配置文件
一、配置文件作用
整个项目中所有重要的数据都是在配置文件中配置的,比如:
-
数据库的连接信息(包含用户名和密码的设置);
-
项目的启动端口;
-
第三方系统的调用秘钥等信息;
-
用于发现和定位问题的普通日志和异常日志等。
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的
二、配置文件的分类
-
系统的配置文件,比如连接字符串、比如日志的相关设置,是系统定义好的
-
用户自定义的
三、配置文件的格式与规则
1、格式
Spring Boot 配置文件主要分为以下两种格式:
.properties
.yml
这就好像连锁店里面的统一服装一样,有两种不同的款式,properties 类型的配置文件就属于老款“服饰”,也是创建 Spring Boot 项目时默认的文件格式(主要是由于仓库里还有库存),而 yml 属于新版款式,如果用户了解情况直接指定要新款服饰,那么就直接发给他
2、规则
-
理论上讲 properties 可以和 yml 一起存在于一个项目当中,当 properties 和 yml 一起存在一个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息。
-
虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率),减少开发者难度。这就好像连锁店的服饰一样,不管是老款的服装还是新款的服装,一定要统一了才好看
3、为配置文件安装提示插件
如果 properies 文件没有提升信息,那么就需要安装spring tools插件了
IDEA 社区版安装 Spring Assistant 插件之后,就可以正常创建 Spring Boot 项目了,并且 yml 的配置文件就有提示了。但默认情况下是不⽀持 properties 格式的日志提示的,这个时候需要安装了 SpringTools 插件才会有相应的提示
四、读取配置文件
1、properties
1.1、properties 配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件
1.1、properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以 “=” 连接的,key=value
,如 application.properties:
# 系统的配置文件
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123# 自定义配置项
cctalk.token=xxx
想要查看 Spring Boot 更多系统配置项,访问官网:Common Application Properties
PS:不加空格,可能会被当做 value 的一部分
小技巧:配置文件中使用“#”来添加注释信息
1.2、关于 properies 中文乱码的问题处理
1). 配置当前项目中文乱码的问题 Settings
2). 配置新创建项目的中文乱码问题 New Projects Settings
3). 将原来的 application. properies 删除掉,重新再创建一个 application. properieso
因为之前的配置文件已经是不支持中文编码的文件格式化,设置编码再创建 application.properies 之后,所以后设置的编码不会改变原来的旧的 application.properies 文件,所以需要先将之前的配置文件删除掉重新创建。
经过上面的 3 步之后才能创建一个不是中文乱码的 application. properies 文件,并且以后在创建 application. properies 不会出现中文乱码
1.3、读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用 “${}” 的格式读取,如下代码所示
@Controller
public class UserController {@Value("${server.port}") // 读取配置项private String port;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "hello, word —— port: " + port;}
}
访问 http://localhost:8080/sayhi,最终执行效果:hello, word —— port: 8080
@Component 在 Spring Boot 启动时候会注入到框架中,注入到框架中时会执行 @PostConstruct 初始化方法,这个时候就能读取到配置信息了
1.4、properties 缺点分析
读取多个配置文件:
properties 配置是以 key-value 的形式配置的
从上述配置key看出,properties 配置文件中会有很多的冗余的信息:
spring.datasource.username=root
spring.datasource.password=123
想要解决这个问题,就可以使用 yml 配置文件的格式化了
2、yml
2.1、yml 配置文件说明
-
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是 “另一种标记语言”
-
yml 是一个写法简单,可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,
-
支持更多的数据类型,可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
-
yml 最大的优势是可以跨语言,不止是 Java 中可以使用 golang、python 都可以使用 yaml 作为配置文件
2.2、yml 基本语法
yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒汗加空格的方式组成的,其中的空格不可省略。
基础语法如下:
其中第一项的配置为正确的,key 也是高亮显示的,而第二项没有空格是错误的使用方式,第二项的key 也没有高亮显示

2.3、使用 yml 连接数据库
application.yml:
# 连接数据库
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=truename: rootpassword: 123
yml 和 properties 连接数据库的配置对比:
3、yml 使用进阶
3.1 yml 配置不同数据类型及 null
# 字符串
string.value: Hello# 布尔值,true或false
boolean.value: true
boolean.value1: false# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法# Null,~代表null
null.value: ~
3.2、配置读取
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
@Component
public class ReadYml {@Value("${string.hello}")private String hello;@PostConstructpublic void postConstruct() {System.out.println("Read YML,Hello:" + hello);}
}
使用代码测试一下,读取值为 null 的配置和根本不存在的配置结果是否一致?
3.3、value 值加单双引号
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义
尝试在 application.yml 中配置如下信息:
mystring1: hello\nword
mystring2: 'hello\nword'
mystring3: "hello\nword"
读取程序实现代码如下:
@Controller
public class UserController {@Value("${mystring1}") // 读取配置项private String mystring1;@Value("${mystring2}")private String mystring2;@Value("${mystring3}")private String mystring3;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {System.out.println("mystring1: " + mystring1);System.out.println("mystring2: " + mystring2);System.out.println("mystring3: " + mystring3);}
}
访问 http://localhost:8080/sayhi,执行结果:
如果在 mystring3 中加入转义符 \
:mystring3: "hello\\nword"
结果:mystring3: hello\nword
从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号
- 单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- 如果不加,或者加了单引号,那么默认会将字符串中的特殊字符进行转义,比如\n -> \ ln(转义)处理
- yml 中如果使用了双引号就会按照(原)语义执行,双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
3.4、yml 对象配置和读取
——application.yml:
# 对象写法 1:
student:id: 1name: 张三age: 20# 对象写法 2:行内写法(与上面的写法作用一致)
student2: {id: 2,name: 李四,age: 20}
这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解 @ConfigurationProperties
来读取 常见类 Student,具体实现如下:
@Data
中包含了 getter,setter,toString 等
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "student") // 读取配置文件中的对象 在项目启动时读取
@Component // 不能省略
public class Student {private int id;private String name;private int age;
}
——调用类的实现如下:
@Controller
public class UserController {@Autowiredprivate Student student; // 属性注入@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "student: " + student;}
}
访问,执行效果:student: Student(id=1, name=张三, age=20)
读李四:修改Student 类:@ConfigurationProperties(prefix = “student2”)。
3.5、yml 配置集合
——application.yml:
# 集合写法 1:
dbtypes:
name:- mysql- sqlserver- db2# 集合写法 2:行内写法(与上面的写法作用一致)
dbtype: {name: [mysql,sqlserver,db2]}
——集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,创建类 ReadList 具体实现如下:
@Component
@Data
@ConfigurationProperties("dbtype") // 读取配置文件中的集合
public class ReadList {private List<String> name;
}
——打印类的实现如下:
@Controller
public class UserController {@Resourceprivate ReadList readList;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "readList: " + readList.getName();}
}
访问,执行效果:readList: [mysql, sqlserver, db2]
4、properties VS yml 总结
properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用“: ”英文冒号加空格的方式设置,并且空格不可省略。
properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
yml 通用性更好,⽀持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份配置文件作为 Java 和 Go 的共同配置文件。
yml 虽然可以和 properties 共存,但一个项目中建议使用统一的配置类型文件
五、SpringBoot有几种读取配置文件的方法?
Spring Boot 中读取配置文件有以下 5 种方法:
-
使用@Value 读取配置文件
-
使用@ConfigurationProperties读取配置文件
-
使用Environment读取配置文件
-
使用@PropertySource 读取配置文件
使用@PropertySource 注解可以用来指定读取某个配置文件,比如指定读取application.properties配置文件的配置内容
@PropertySource 注解默认只支持 properties 格式配置文件的读取
@springBootApplication
@PropertySource( "classpath:application.properties", encoding="utf-8")
public class DemoApplication implements InitializingBean {@Value("${profile.name}")private string name;public static void main(String[ ] args) {SpringApplication.run(DemoApplication.class, args );}@Overridepublic void afterPropertiesSet( ) throws Exception {System.out.println("Name: " +name ) ;}
- 使用原生方式读取配置文件
相关文章:

SpringBoot 配置文件
一、配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的,比如: 数据库的连接信息(包含用户名和密码的设置); 项目的启动端口; 第三方系统的调用秘钥等信息; 用于发现和定位问题的…...
【K8S】 deployment.yaml文件与Service yaml文件详解
目录 deployment.yaml文件详解Service yaml文件详解 deployment.yaml文件详解 apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata:name: cango-demo #Deployment名称namespace: cango-prd #命名空间l…...
GMSL 9296芯片对GMSL链路 插损/回损/线束要求
基于美信 9296的芯⽚ 对于GMSL信号链路上的需求如下: 1:插损 频段2M~3.5GHZ 在3G时需要⼩于-21db。通信速率 6Gbps/187Mbps 频段2M~3.5GHZ 在3G时需要⼩于-18db。通信速率 6Gbps/1.5Gbps 频段2M~2GHZ 在1.5G时需要⼩于-19.5db。通信速率 3Gbps/187Mbps …...

用库造一个list的轮子 【C++】
文章目录 list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 迭代器迭代器为什么要存在?const_iteratorbegin和end inserterasepush_back && pop_backpush_front &&pop_frontswap 完整代码 list的模拟实现 默认成员函数 构造…...
java中的,>>,<<位运算
目录 二进制 >>,<< & 二进制 计算机内部使用二进制计数 二进制:在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的,这一系统中,通常用两个不同的符号0(代表零)和…...

成功解决Android设备adb连接后显示device unauthorized
一、提出问题 在电脑通过USB连接新的Android设备,想要通过adb来进行一些操作时,却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…...

初识mysql数据库之引入mysql客户端库
目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…...

勘探开发人工智能技术:机器学习(1)
0 提纲 2.1 什么是机器学习 2.2 不确定性 2.3 数据类型 2.4 分类、回归、聚类 2.5 分类问题的训练与测试 2.6 性能评价指标 1 什么是机器学习 对于西瓜这个抽象类来说,它具有“色泽”,“根蒂”,“敲声”三个属性: 通过观察这个…...

MySQL查看当前数据库视图-SQL语句
引言 查询语句为: show full tables where table_type 可查询当前数据库表 一,创建一个视图 # 创建视图 create view v_stu as # 视图内容(连接的一个表) select name from t_stu union all select tname from t_teach; 二&…...

Clickhouse 存储引擎
一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上,添加了”处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…...
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka 场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个…...

【第一阶段】kotlin的函数
函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范,先有输入( getMethod(name:String,age:Int))再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…...
PAM安全配置-用户密码锁定策略
PAM是一个用于实现身份验证的模块化系统,可以在操作系统中的不同服务和应用程序中使用。 pam_faillock模块 pam_faillock模块用来实现账号锁定功能,它可以在一定的认证失败次数后锁定用户账号,防止暴力破解密码攻击。 常见选项 deny&…...
AndroidManifest.xml日常笔记
1 Bundle介绍 Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。 我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组…...

SpringBoot异步框架
参考:解剖SpringBoot异步线程池框架_哔哩哔哩_bilibili 1、 为什么要用异步框架,它解决什么问题? 在SpringBoot的日常开发中,一般都是同步调用的。但经常有特殊业务需要做异步来处理,例如:注册新用户&…...

导出LLaMA ChatGlm2等LLM模型为onnx
通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。 这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行…...
C++项目:在线五子棋对战网页版--匹配对战模块开发
玩家匹配是根据自己的天梯分数进行匹配的,而服务器中将玩家天梯分数分为三个档次: 1. 普通:天梯分数小于2000分 2. 高手:天梯分数介于2000~3000分之间 3. 大神:天梯分数大于3000分 当玩家进行对战匹配时,服…...

ssh 连接断开,正在执行的shell脚本也被中断了
背景 最近在训练chatGLM,一次训练经常要花掉近2个小时,但是由于网络不稳定,经常ssh莫名的断开,导致训练不得不重新开启,这就很浪费时间了 解决方案 下面教大家一种在后台执行命令的方案,即使你ssh连接断…...
UML 用例图,类图,时序图,活动图
UML之用例图,类图,时序图,活动图_用例图 时序图_siyan985的博客-CSDN博客 https://www.cnblogs.com/GumpYan/p/14734357.html 用例图与类图 - 简书...
Java 面试题2023
Java core JVM 1、JVM内存模型 2、JVM运行时内存分配 3、如何确定当前对象是个垃圾 4、GCrooot 包括哪些? 5、JVM对象头包含哪些部分 6、GC算法有哪些 7、JVM中类的加载机制 8、分代收集算法 9、JDK1.8 和 1.7做了哪些优化 10、内存泄漏和内存溢出有什么区别 11、J…...
自定义protoc-gen-go生成Go结构体,统一字段命名与JSON标签风格
背景 在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代…...
LLM基础2_语言模型如何文本编码
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 字节对编码(BPE) 上一篇博文说到 为什么GPT模型不需要[PAD]和[UNK]? GPT使用更先进的字节对编码(BPE),总能将词语拆分成已知子词 为什么需要BPE? 简…...

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据
功能: 遍历生成20到1000个节点的无线通信网络拓扑推理数据,包括网络拓扑和每个节点发射的电磁信号,采样率1MHz/3000,信号时长5.7s,单帧数据波形为实采 数据生成效果: 拓扑及空间位置: 节点电磁…...

小番茄C盘清理:专业高效的电脑磁盘清理工具
在使用电脑的过程中,我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题,这些问题不仅会导致电脑运行缓慢,还可能引发系统崩溃。为了解决这些问题,小番茄C盘清理应运而生。它是一款专业的C盘清理软件,能…...

分布式锁实战:Redisson vs. Redis 原生指令的性能对比
分布式锁实战:Redisson vs. Redis 原生指令的性能对比 引言 在DIY主题模板系统中,用户可自定义聊天室的背景、图标、动画等元素。当多个运营人员或用户同时修改同一模板时,若没有锁机制,可能出现“甲修改了背景色,乙…...
函数与数列的交汇融合
前情概要 现行的新高考对数列的考查难度增加,那么整理与数列交汇融合的相关题目就显得非常必要了。 典例剖析 依托函数,利用导数,求数列的最值;№ 1 、 \color{blue}{№ 1、} №1、 等差数列 { a n } \{a_{n}\} {an} 的前 n n n 项和为 S n S_{n} Sn, 已知 S 10…...

行为型设计模式之Interpreter(解释器)
行为型设计模式之Interpreter(解释器) 前言: 自己的话理解:自定义一个解释器用来校验参数或数据是否合法。 1)意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解…...

Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试
docker运行Ktransformers部署Qwen3MOE模型实战及 性能测试 最开始拉取ktransformers:v0.3.1-AVX512版本,发现无论如何都启动不了大模型,后来发现是cpu不支持avx512指令集。 由于本地cpu不支持amx指令集,因此下载avx2版本镜像: …...

传统业务对接AI-AI编程框架-Rasa的业务应用实战(番外篇2)-- Rasa 训练数据文件的清理
经过我的【传统业务对接AI-AI编程框架-Rasa的业务应用实战】系列 1-6 的表述 已经实现了最初的目标:将传统平台业务(如发票开具、审核、计税、回款等)与智能交互结合,通过用户输入提示词或语音,识别用户意图和实体信…...

【深度学习新浪潮】如何入门三维重建?
入门三维重建算法技术需要结合数学基础、计算机视觉理论、编程实践和项目经验,以下是系统的学习路径和建议: 一、基础知识储备 1. 数学基础 线性代数:矩阵运算、向量空间、特征分解(用于相机矩阵、变换矩阵推导)。几何基础:三维几何(点、线、面的表示)、射影几何(单…...