【Spring】Spring配置文件
目录
什么是配置文件?
配置文件的作用
SpringBoot配置文件
配置文件格式
配置文件的优先级
properties配置文件说明
properties基本语法
读取配置文件
properties缺点
yml配置文件说明
yml基本语法
使用yml连接数据库
yml配置不同数据类型及null
注意事项
@PostConstruct
配置对象
配置集合
配置Map
yml配置文件的优缺点
优点
缺点
总结
什么是配置文件?
配置文件是一种存放应用程序或系统配置的文件,包含了程序运行时所需要的各种选项和配置信息,例如字体样式、默认语言等。它允许开发者和用户在不修改代码的情况下,调整应用程序的行为和性能。配置文件通常以文本形式存在,格式可以是XML、JSON、YAML(yml)、INI、Properties等。
配置文件的作用
配置文件主要是为了解决硬编码代码的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。
使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
硬编码指的是将数据直接嵌入到程序或者其他可执行对象的源代码中,也就是我们常说的将“代码写死”。
SpringBoot配置文件
SpringBoot支持并定义了配置文件的格式,也是在另一个层面达到了规范其他框架集成到SpringBoot的目的。
很多项目或者框架的配置信息也放在配置文件中,如:
- 项目的启动端口号
- 数据库的连接信息(包含用户名和密码的设置)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等
在SpringBoot中,内置了Tomcat服务器,默认端口号是8080,但在用户电脑上8080端口号可能会被其他应用程序占用,此外,如果启动多个SpringBoot项目,那么端口号也需要不同,所以SpringBoot需要支持让用户自定义端口号。
配置文件格式
在SpringBoot中,有三种不同形式的配置文件:
- application.properties
- application.yml
- application.yaml
yml是yaml的缩写,实际开发中出现的频率最高。yaml和yml使用方式是一样的,都是键值对的形式,所以后面我们只讲yml。
当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件,当然也可以使用 spring.config.name 指定文件路径和名称。
配置文件的优先级
- 理论上,application.properties 和 application.yml 是可以同时存在同一个项目中的,当这两个配置文件都存在,两个配置都会加载。如果配置文件内容有冲突,以application.properties 为主,即 application.properties 的优先级更高。
- 虽然在理论上两个配置文件可以共存,但在实际的业务中,我们都是采用一种统一的配置文件,这样可以更好的维护(降低故障率)。
properties配置文件说明
properties配置文件是最早期的配置文件格式,也就是创建SpringBoot项目默认的配置文件。
properties基本语法
properties是以键值对的形式配置的,key和value之间用“=”来连接。
示例:
#配置项目端口号
server.port=9090
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false
#配置数据库用户名
spring.datasource.username=root
#配置数据库密码
spring.datasource.password=root
#配置数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
配置文件中使用 # 来添加注释信息。
读取配置文件
在项目中,如果我们想要读取到配置文件中的内容,需要使用 @Value 注解,并且在注解中使用“${}”的格式来读取。
my.text=hello world
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${my.text}")private String key;@RequestMapping("/text1")public String getValue() {return "获取到的value为:" + key;}
}

properties缺点
properties配置是以键值对的形式配置的,我们通过观察,可以看到里面有些代码比较冗余。

此外,properties配置格式对中文也是不友好,我们把value值换为中文,再来试一下:
my.text=你好 世界

为什么会这样,我们可以打断点看一下:

可以看到,key的值是四个问号。 但是idea默认的字符集是UTF-8,是支持中文的,为了防止这种情况发生,所以我们在properties配置文件中尽量不要出现中文。
接下来,我们来讲一下yml配置文件。
yml配置文件说明
yml是yaml的缩写,全程是 Yet Another Markup Language 翻译过来就是“另一种标记语言”。
yml基本语法
yml是树形结构的配置文件,基本语法是:key: value(注意:冒号后面是有空格的,不能省略!!!)
key后+(冒号+空格)

我们可以看到,正确的写法的key是会有高亮提示的(橙色,当然应该可以设置成其他颜色),而对于错误的写法,key还是灰色。
此外,只要冒号有空格隔开,就是正确的写法,至于空格的数量,是不限的,当然按照规范来写的话,最好就一个。
使用yml连接数据库
spring: datasource:url: jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
可以看到,相对properties配置文件的写法,yml配置文件的写法不仅能够体现出层级关系还能节省不必要的代码。
此外,yml还有其他操作。
yml配置不同数据类型及null
# 字符串
string.value: hello# 布尔类型
boolean.value: true
boolean.value1: false# 整数类型
int.value: 10# 浮点数
float.value: 3.14159# Null ~ 代表null
null.value: ~# "" 空字符串
# '' 单引号也表示空字符串
# 冒号后面什么都不加也可以表示空字符串。但这种方式不直观,更多的表示是使用引号括起来
empty:value1: ''value2: ""value3:
那么yml配置文件的属性应该如何获取?
其实跟properties配置文件获取属性的操作一样,都是要使用 @Value 注解来进行获取的。
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${string.value}")private String value;@Value("${boolean.value}")private Boolean value1;@Value("${boolean.value1}")private Boolean value2;@Value("${int.value}")private Integer value3;@Value("${float.value}")private Float value4;@Value("${null.value}")private String value5;@RequestMapping("/getValue")public String getValue() {return "获取到的value为:" + value+" | "+value1+" | "+value2+" | "+value3+" | "+value4+" | "+value5;}
}

注意事项
字符串默认不用加上单引号或者双引号,如果加英文的双引号可以表示特殊的含义,而如果加英文的单引号则不会表示特殊的含义。
我们来看个例子来理解这段话的意思:
string:value1: Hello \n SpringBootvalue2: 'Hello \n SpringBoot'value3: "Hello \n SpringBoot"
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${string.value1}")private String value1;@Value("${string.value2}")private String value2;@Value("${string.value3}")private String value3;@RequestMapping("/getValue")public String getValue() {System.out.println(value1);System.out.println(value2);System.out.println(value3);return "OK";}
}

可以看到,不加引号的和加单引号的不会让“\n”进行换行,而加双引号的依旧会让"\n"进行换行操作。
我们可以得出结论:
- 字符串默认不用加上单引号或双引号;
- 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串;
- 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。
可能会有点绕,\n本义是换行
使用单引号会转义,就是说不再换行了,\n只是一个普通的字符串;
使用双引号不会转义,就是说\n依旧是它本身的含义,即换行。
这里我们来了解一个新的注解:@PostConstruct
@PostConstruct
@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。所以我们这里可以偷个懒,后面的讲解我们就使用这个注解来帮我们完成测试。
需要注意:
- 用该注解修饰的方法必须是非静态方法;
- 不能有参数;
- 返回类型通常是void。
配置对象
yml配置文件不仅能配置一些基本的数据类型,还能配置对象。
写法如下:
#配置对象
student:name: '张三'age: 18
也可以写成行的形式:
#行的形式
student1: {name: '张三', age: 18}
那么这个时候我们就不能使用 @Value 注解来获取配置中的对象了,需要使用另外一个注解@ConfigurationProperties 来读取,如下:
package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "student")//prefix表示前缀
public class Student {private String name;private int age;
}
@Controller
public class PropertiesController {@Autowiredprivate Student student;@PostConstructpublic void getStudent() {System.out.println(student);}
}
![]()
配置集合
ymp还可以配置集合。
配置格式:
在-后一定要加空格,否则-和后面的内容就成了整体,统一赋值给对应的属性
type:list:- 'zhangsan'- 'lisi'- 'wangwu'
package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@Component
@ConfigurationProperties("type")
public class ListConfig {private List<String> list;}
@Controller
public class PropertiesController {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void getList() {System.out.println(listConfig.toString());}
}

配置Map
package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Map;@Data
@Component
@ConfigurationProperties("maptypes")
public class MapConfig {private Map<String, String> map;
}
package com.example.demo.controller;import com.example.demo.model.ListConfig;
import com.example.demo.model.MapConfig;
import com.example.demo.model.Student;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Controller
public class PropertiesController {@Autowiredprivate MapConfig mapConfig;@PostConstructpublic void getMap() {System.out.println(mapConfig);}
}
![]()
yml配置文件的优缺点
优点
- 可读性⾼,写法简单, 易于理解
- 采用缩进和嵌套来表示层次结构,适合非常复杂配置的管理
- ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点
- 不适合写复杂的配置⽂件
- 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案),对缩进敏感
总结
什么是配置文件?
配置文件是用来存放应用程序或者系统的配置的文件,可以在不动源码的情况下对应用程序的性能和行为进行调整,使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
SpringBoot的配置文件
Spring有三种配置文件:
- application.properties
- application.yml
- application.yaml
application.properties 和 application.yml 是可以同时存在同一个项目中的,以application.properties为主,.properties的优先级更高。
配置文件的格式
- application.properties:键值对形式,key和value用“=”隔开
- application.yml:也是键值对,key和value用“冒号+空格”隔开。
读取配置文件的方式
对于基本的数据类型,我们采用 @Value 注解即可,但对于对象、集合、map这些,我们需要使用 @ConfigurationProperties 。
@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。要求是:方法不能是静态方法,不能有参数,返回值尽量为void。
以上就是本篇所有内容~
若有不足,欢迎指正~
相关文章:
【Spring】Spring配置文件
目录 什么是配置文件? 配置文件的作用 SpringBoot配置文件 配置文件格式 配置文件的优先级 properties配置文件说明 properties基本语法 读取配置文件 properties缺点 yml配置文件说明 yml基本语法 使用yml连接数据库 yml配置不同数据类型及null 注意…...
MSI微星电脑冲锋坦克Pro Vector GP76 12UGS(MS-17K4)原厂Win11系统恢复镜像,含还原功能,预装OEM系统下载
适用机型:【MS-17K4】 链接:https://pan.baidu.com/s/1P8ZgXc6S_J9DI8RToRd0dQ?pwdqrf1 提取码:qrf1 微星笔记本原装出厂WINDOWS11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、MSI Center控制中心等预装…...
Unity合批处理优化内存序列帧播放动画
Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容,将多个图片合批处理然后为了降低Unity的内存占用,但是相对的质量也会稍微降低。可自行进行…...
【Java】逻辑运算符详解:、|| 与、 | 的区别及应用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 💯前言💯一、基本概念与运算符介绍💯二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. …...
深入解析 Flutter GetX
深入解析 Flutter GetX:从原理到实战 GetX 是 Flutter 中一个轻量级且功能强大的状态管理、路由管理和依赖注入框架。它以简单、快速、高效著称,适合从小型到大型项目的开发需求。GetX 的设计理念是一体化解决方案,通过一个框架解决状态管理…...
Java 大视界 -- 人才需求与培养:Java 大数据领域的职业发展路径(92)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
顺序表常用操作和笔试题
1、顺序表的常用操作 1.1 顺序表的创建 如下代码所示:创建了一个默认空间为10的整型顺序表,如果空间不足则会以1.5倍扩容。 List<Integer> list new ArrayList<>(); 创建一个空间为15的整型顺序表 List<Integer> list2 new ArrayL…...
List<Map<String, Object>> 如何对某个字段求和
在Java中,如果你有一个List<Map<String, Object>>的结构,并且你想要对某个特定字段进行求和,你可以使用Java 8的Stream API来简化这个过程。下面是一个示例代码,演示如何对某个字段进行求和。 假设你有一个List<M…...
2024亚马逊数据分析!
整体财务数据23 净销售额:全年净销售额达 6380 亿美元,同比增长 11%。 净利润:全年净利润为 592 亿美元,较上年同期的 304 亿美元增长 95%。 经营活动现金流:经营活动现金流达 1159 亿美元,同比增加了 36…...
foobar2000设置DSP使用教程及软件推荐
foobar2000安卓中文版:一款高品质手机音频播放器 foobar2000安卓中文版是一款备受好评的高品质手机音频播放器。 几乎支持所有的音频格式,包括 MP3、MP4、AAC、CD 音频等。不论是经典老歌还是最新的流行音乐,foobar2000都能完美播放。除此之…...
Apache Logic4j 库反序列化漏洞复现与深度剖析
前言 在渗透测试领域,反序列化漏洞一直是安全研究人员和攻击者关注的焦点。今天,我们将深入探讨 Apache Logic4j 库中的反序列化漏洞,详细了解其原理,并进行完整的复现演示。 一、漏洞原理 Apache Logic4j 库在处理对象的反序列…...
FPGA VIVADO:axi-lite 从机和主机
FPGA VIVADO:axi-lite 从机和主机 TOC在这里插入代码片 前言 协议就不详细讲解了,直接看手册即可。下面主要如何写代码和关键的时序。 此外下面的代码可以直接用于实际工程 一、AXI-LITE 主机 数据转axi lite接口: 读/写数据FIFO缓存 仲裁:…...
LabVIEW 中的 3dgraph.llb库
3dgraph.llb 库位于C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform目录下,是 LabVIEW 系统里用于 3D 图形相关操作的关键库。它为 LabVIEW 用户提供众多功能,可在应用程序内创建、显示和交互各类 3D 图形,极大增…...
【Linux】文件系统:文件fd
🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.回顾C文件接口02.系统文件I/O02.1 openflags 参数(文件打开模式)标记位传参1. 访问模式(必须指定一个)2. 额外控制标志…...
Vue学习记录19
TransitonGroup <TransitionGroup> 是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 和 <Transtion> 的区别 <TranstionGroup> 支持和 <Transtion> 基本相同的 props、CSS过渡 class 和 JavaScript…...
MATLAB更改图论的布局:设置layout
在图论那一章,我们讲过最小生成树和单源最短路径(见:从零开始学数学建模): 以最短路径那节课为例,把绘图pplot那部分代码写为: % plot绘图有很多参数可以设置,使图尽量美观 P plot…...
【分果果——DP(困难)】
题目 分析 分果果题解参考,下面是补充https://blog.csdn.net/AC__dream/article/details/129431299 关于状态 设f[i][j][k]表示第i个人取到的最后一个糖果编号是j,第i-1个人取到的最后一个糖果编号小于等于k时的最大重量的最小值 关于转移方程 关于 j …...
禁止WPS强制打开PDF文件
原文网址:禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR,输入:regedit,回车。找到:HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…...
罗技鼠标接收器丢了,怎么用另一个logi接收器重新配对?
1.首先接收器得是logi的,其次看这个接收器是什么类型的,一共有以下3种。(这几种接收器都可以给其他logi鼠标用) 下图左侧带红标的这个(标可能带颜色或者是透明,都一样),叫多设备接收…...
ffmpeg configure 研究2:分析屏幕输出及文件输出的具体过程
author: hjjdebug date: 2025年 02月 17日 星期一 16:57:55 CST description: ffmpeg configure 研究2 分析屏幕输出及文件输出的具体过程 文章目录 0. 执行./configure 命令1. sed: cant read 信息是从哪里来的 ?1.1 find_filters_extern()1.2 find_things_extern() 2. 屏幕输…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...
前端异步编程全场景解读
前端异步编程是现代Web开发的核心,它解决了浏览器单线程执行带来的UI阻塞问题。以下从多个维度进行深度解析: 一、异步编程的核心概念 JavaScript的执行环境是单线程的,这意味着在同一时间只能执行一个任务。为了不阻塞主线程,J…...
n8n:解锁自动化工作流的无限可能
在当今快节奏的数字时代,无论是企业还是个人,都渴望提高工作效率,减少重复性任务的繁琐操作。而 n8n,这个强大的开源自动化工具,就像一位智能的数字助手,悄然走进了许多人的工作和生活,成为提升…...
leetcode 386. 字典序排数 中等
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]示例 2: 输入:n 2…...

