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

Spring Boot配置文件详解

前言

Spring Boot 官方提供了两种常用的配置文件格式,分别是propertiesYML格式。相比于properties来说,YML更加年轻,层级也是更加分明。

1. properties格式简介

常见的一种配置文件格式,Spring中也是用这种格式,语法结构很简单,结构为:key=value。具体如下:

userinfo.name=myjszl
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2

上述配置文件中对应的实体类如下:

@Data
@ToString
public class UserInfo {private String name;private Integer age;private Boolean active;private Map<String,Object> map;private Date createdDate;private List<String> hobbies;
}

2.YML格式简介

以空格的缩进程度来控制层级关系。空格的个数并不重要,只要左边空格对齐则视为同一个层级。注意不能用tab代替空格。且大小写敏感。支持字面值,对象,数组三种数据结构,也支持复合结构。
字面值:字符串,布尔类型,数值,日期。字符串默认不加引号,单引号会转义特殊字符。日期格式支持yyyy/MM/dd HH:mm:ss
对象:由键值对组成,形如 key:(空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致,也可以使用行内写法:{k1: v1, …kn: vn}
数组:由形如 -(空格)value 的数据组成。短横线后面的空格是必须要有的,每组数据占用一行,且缩进的程度要一致,也可以使用行内写法:[1,2,…n]
复合结构:上面三种数据结构任意组合

如何使用

在src/resources文件夹下创建一个application.yml文件。支持的类型主要有字符串,带特殊字符的字符串,布尔类型,数值,集合,行内集合,行内对象,集合对象这几种常用的数据格式。

具体的示例如下:

userinfo:age: 25name: myjszlactive: truecreated-date: 2018/03/31 16:54:30map: {k1: v1,k2: v2}hobbies:- one- two- three- 

上述配置文件对应的实体类如下:

@Data
@ToString
public class UserInfo {private String name;private Integer age;private Boolean active;private Map<String,Object> map;private Date createdDate;private List<String> hobbies;
}

如何从配置文件取值?

一切的配置都是为了取值,Spring Boot也是提供了几种取值的方式,下面一一介绍。

@ConfigurationProperties

这个注解用于从配置文件中取值,支持复杂的数据类型,但是不支持SPEL表达式。
该注解中有一个属性prefix,用于指定获配置的前缀,毕竟配置文件中的属性很多,也有很多重名的,必须用一个前缀来区分下。
该注解可以标注在类上也可以标注在方法上,这也注定了它有两种获取值的方式。

  1. 标注在实体类上
    这种方式用于从实体类上取值,并且赋值到对应的属性。使用如下:
 /*** @Component :注入到IOC容器中* @ConfigurationProperties:从配置文件中读取文件*/
@Component
@ConfigurationProperties(prefix = "userinfo")
@Data
@ToString
public class UserInfo {private String name;private Integer age;private Boolean active;private Map<String,Object> map;private Date createdDate;private List<String> hobbies;
}

标注在配置类中的方法上
标注在配置类上的方法上,同样是从配置文件中取值赋值到返回值的属性中。使用如下:

   /*** @Bean : 将返回的结果注入到IOC容器中* @ConfigurationProperties :从配置文件中取值* @return*/@ConfigurationProperties(prefix = "userinfo")@Beanpublic UserInfo userInfo(){return new UserInfo();}

总结

@ConfigurationProperties注解能够很轻松的从配置文件中取值,优点如下:

支持批量的注入属性,只需要指定一个前缀prefix支持复杂的数据类型,比如List、Map对属性名匹配的要求较低,比如user-name,user_name,userName,USER_NAME都可以取值支持JAVA的JSR303数据校验
注意:@ConfigurationProperties这个注解仅仅是支持从Spring Boot的默认配置文件中取值,比如application.properties、application.yml。

@Value

@Value这个注解估计很熟悉了,Spring中从属性取值的注解,支持SPEL表达式,不支持复杂的数据类型,比如List。使用如下:

    @Value("${userinfo.name}")private String UserName;

如何从自定义配置文件中取值?
Spring Boot在启动的时候会自动加载application.xxx和bootsrap.xxx,但是为了区分,有时候需要自定义一个配置文件,那么如何从自定义的配置文件中取值呢?此时就需要配合@PropertySource这个注解使用了。
只需要在配置类上标注@PropertySource并指定你自定义的配置文件即可完成。如下:

@SpringBootApplication
@PropertySource(value = {"classpath:custom.properties"})
public class DemoApplication {}

value属性是一个数组,可以指定多个配置文件同时引入。
@PropertySource默认加载xxx.properties类型的配置文件,不能加载YML格式的配置文件,怎么破???
如何加载自定义YML格式的配置文件?
@PropertySource注解有一个属性factory,默认值是PropertySourceFactory.class,这个就是用来加载properties格式的配置文件,我们可以自定义一个用来加载YML格式的配置文件,如下:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;import java.io.IOException;
import java.util.Properties;public class YmlConfigFactory extends DefaultPropertySourceFactory {@Overridepublic PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {String sourceName = name != null ? name : resource.getResource().getFilename();if (!resource.getResource().exists()) {return new PropertiesPropertySource(sourceName, new Properties());} else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {Properties propertiesFromYaml = loadYml(resource);return new PropertiesPropertySource(sourceName, propertiesFromYaml);} else {return super.createPropertySource(name, resource);}}private Properties loadYml(EncodedResource resource) throws IOException {YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();factory.setResources(resource.getResource());factory.afterPropertiesSet();return factory.getObject();}}

此时只需要将factory属性指定为YmlConfigFactory即可,如下:

@SpringBootApplication
@PropertySource(value = {"classpath:custom.yml"},factory = YmlConfigFactory.class)
public class DemoApplication {

总结

@PropertySource指定加载自定义的配置文件,默认只能加载properties格式,但是可以指定factory属性来加载YML格式的配置文件。

相关文章:

Spring Boot配置文件详解

前言 Spring Boot 官方提供了两种常用的配置文件格式&#xff0c;分别是properties、YML格式。相比于properties来说&#xff0c;YML更加年轻&#xff0c;层级也是更加分明。 1. properties格式简介 常见的一种配置文件格式&#xff0c;Spring中也是用这种格式&#xff0c;语…...

实习面试题整理1

1、进行一下自我介绍 2、介绍一下你简历里的两个项目 3、说说vue的生命周期&#xff08;具体作用&#xff09; 4、说说你对vue单页面和多页面应用的理解 5、说说vue里自带的数组方法&#xff08;七种&#xff0c;往响应式数据上靠&#xff09; 6、说说vue双向数据绑定&…...

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…...

OpenCV——常用函数

cv::circle(overlay, pt, 2, cv::Scalar(0,green,red),-1); 使用OpenCV库中的circle()函数在图像上绘制圆形的代码。 具体来说&#xff0c;它的参数如下&#xff1a; - overlay&#xff1a;图像&#xff0c;在该图像上绘制圆形&#xff1b; - pt&#xff1a;圆心位置的cv:…...

超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在编写测试用例&…...

OJ练习第70题——困于环中的机器人

困于环中的机器人 力扣链接&#xff1a;1041. 困于环中的机器人 题目描述 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受…...

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样&#xff0c;Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;也是线程私有的&#xff0c;它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…...

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

场景 1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解&#xff0c; 然后综合各个小问题&#xff0c;得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...

2个 windows 下的网络测试工具

环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具&#xff0c;它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址&#xff1a; https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...

HDU - 4734 -- F(x)

题目如下&#xff1a; For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(An​An−1​An−2​...A2​A1​), we define its weight as F(x)An∗2n−1An−1∗2n−2...A2∗2A1∗1.F(x) A_n * 2^{n-1} A_{n-1} * 2^{n-2} ... A_2 *…...

【音视频第10天】GCC论文阅读(1)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…...

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源&#xff0c;管理员必须监视和控制对企业数据的访问。与传统工作站不同&#xff0c;传统工作站位于企业的物理工作区内&#xff0c;移动设备从多个位置使用&#xff0c;从而使移动资产管理过程更加复杂。 什么是移动资产管理 …...

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…...

Oracle之增删改(六)

1、插入语句 insert into 表名(列名1&#xff0c;列名2,…&#xff09; values(值&#xff0c;值,…) insert into 关键字 列名&#xff08;要插入数据的列&#xff09;&#xff0c;可以省略&#xff0c;省略时表示给表中的每个字段都插入数据 value 赋值关键字 使用这种语法一…...

OJ练习第81题——岛屿数量

岛屿数量 力扣链接&#xff1a;200. 岛屿数量 题目描述 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向…...

remote gdb 操作流程

进行gdb调试时&#xff0c;tui可以方便地显示源代码、汇编和寄存器文本窗口。在进入gdb界面后&#xff0c;使用TUI快捷键&#xff08;ctrlXA&#xff09;可以打开/关闭tui。 出现"找不到源码"的提示时&#xff0c;可以通过dir加源码路径来设置源码查找路径&#xff…...

STM32基础代码学习G070CB串口透传调试(出厂默认)代码

先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1&#xff0c;最后查询ATQIACT? 配置阿里云mqtt atqmtc…...

介绍一款idea神级插件【Bito-ChatGPT】

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…...

pycharm 2021.2.2 版本之前试用期过了怎么办

pycharm 2021.2.2 版本之前试用期过了怎么办 虽然 jetbrains 的产品是商业收费&#xff0c;而且价格不菲&#xff0c;但官方还是为免费使用留下的空间&#xff0c;实在良心。 收费版可以免费试用30天&#xff0c;问题是30天试用期过后&#xff0c;怎么办&#xff0c;可以再次试…...

【通世智库】宁晓红:医疗更完整的样子

2022年的10月&#xff0c;北京协和医院缓和医学中心成立了&#xff0c;这是巨大的好消息&#xff01;北京协和医院连续13年蝉联中国医院排行榜榜首&#xff0c;它率先成立了缓和医学中心&#xff0c;可见缓和医疗在医学领域的重要地位和不可估量的价值。【作者&#xff1a;宁晓…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...