SpringBoot 读取配置文件的4种方式
文章目录
- 1. @Value 注解读取单个属性
- 2. 使用 @ConfigurationProperties 注解
- 3. 通过 Environment 对象读取属性
- 4. 使用 @PropertySource 注解加载额外的配置文件
在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/main/resources 目录下的 application.properties 或 application.yml 文件中读取配置。读取 application.yml 文件中的配置可以通过以下几种常用的方法进行:
@Value: 适合读取简单的单一属性。@ConfigurationProperties: 适合读取复杂的配置集。Environment: 适合在运行时动态访问配置。@PropertySource: 加载.properties文件。
1. @Value 注解读取单个属性
@Value 注解用于读取单一简单的配置属性,该注解可以直接应用于字段、构造函数或方法参数上,不要求提供 Setter 方法。
-
在
application.yml配置文件中添加如下配置:app:name: MyAppkeys:- key1- key2 -
使用
@Value注解从配置文件中读取单个属性值:-
字段注入:将
@Value注解应用于字段,Spring 将直接将配置值注入到字段中。@Component public class MyComponent {@Value("${app.name}")private String name;} -
构造函数注入:
@Value也可以用于构造函数参数。@Component public class MyComponent {private final String name;public MyComponent(@Value("${app.name}") String name) {this.name = name;}} -
方法参数注入:
@Value注解用于方法参数。@Component public class MyComponent {private String name;@Value("${app.name}")public void setKeys(String name) {this.name = name;}}
-
注意:
@Value注解无法处理复杂的配置,如集合,如下处理会在应用启动时抛出IllegalArgumentException异常:Could not resolve placeholder 'app.keys' in value "${app.keys}"@Value("${app.keys}") private List<String> keys;
2. 使用 @ConfigurationProperties 注解
@ConfigurationProperties 用于将配置文件中的属性绑定到 Java 对象中。适合处理结构化的配置,比如嵌套的属性或复杂的属性集合。
-
在
application.yml配置文件中添加如下配置:app:name: MyAppkeys:- key1- key2 -
在类上使用
@ConfigurationProperties注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:@Component @ConfigurationProperties(prefix = "app") public class AppProperties {private List<String> keys;}
注意:
@ConfigurationProperties读取配置时需要确保配置文件中的属性名与 Java 类中的属性名匹配。
3. 通过 Environment 对象读取属性
Environment 是 Spring 中用于管理和访问配置属性、配置文件和环境变量的一个抽象接口,该对象提供了一种管理和访问配置属性、激活的配置文件和环境变量的统一方式。我们可以在任何 Spring 管理的 bean 中通过注入 Environment 对象来获取配置属性。
-
在
application.yml配置文件中添加如下配置:app:name: MyAppkeys:- key1- key2 -
在类中注入
Environment对象,使用env.getProperty(String key)来检索属性的值。@Component public class MyComponent {@Autowiredprivate Environment env;public void printConfig() {String port = env.getProperty("server.port");System.out.println("Server Port: " + port);} }
注意:
Environment在加载 YML 配置文件时,会将每个元素视为单独的键。即
application.yml文件中的配置:yamlCopy Codeapp:keys:- key1- key2- key3在
Environment中,将被处理为:
app.keys[0]对应key1app.keys[1]对应key2app.keys[2]对应key3因此对于复杂配置需要特殊处理,例如获取集合元素需要使用类似数组索引的语法来访问 YAML 文件中的列表元素。
4. 使用 @PropertySource 注解加载额外的配置文件
@PropertySource 注解是 Spring Framework 提供的一个注解,用于加载额外 .properties 配置文件或其他资源文件中的属性到 Spring 的 Environment 中。
-
在
src/main/resources目录下创建config.properties的属性文件:app.name=MyApp app.version=1.0.0 -
在配置类上使用
@PropertySource注解来加载配置文件:@Configuration @PropertySource("classpath:config.properties") //@PropertySource({"classpath:config.properties", "classpath:another-config.properties"}) public class AppConfig {} -
使用
@Value注解或Environment对象获取属性:import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;@Component public class MyComponent {@Value("${app.name}")private String appName;@Autowiredprivate Environment env;public void printAppInfo() {System.out.println("App Name: " + appName);String appVersion = env.getProperty("app.version");System.out.println("App Version: " + appVersion);} }
注意: 如果需要加载多个属性文件,可以在
@PropertySource注解中使用value属性指定多个文件路径:@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
- 路径:
classpath:前缀表示文件在类路径中。如果文件位于文件系统的其他位置,你可以使用文件系统路径,例如file:/path/to/config.properties。- 覆盖:
@PropertySource加载的属性文件中的属性会覆盖同名的系统属性,但不会覆盖由 Spring Boot 的application.properties或application.yml文件中定义的属性。- 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。
相关文章:
SpringBoot 读取配置文件的4种方式
文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/…...
【车载开发系列】ParaSoft单元测试环境配置(三)
【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…...
如何让Threejs的canvas背景透明?
在Three.js中,要让Canvas的背景透明,只显示场景中的模型或物体,有两个关键点: 一、对渲染器(Renderer)进行alpha为true配置; 二、通过CSS设置,使canvas设定为透明背景模式。 以下是代…...
Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法
Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…...
[性能]高速收发的TCP/MQTT通信
Nagle算法是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前&#x…...
OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)
往期知识点记录: OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例 OpenHarmony(鸿蒙南向开发)——Combo解决方案之W800芯片移植案例 OpenHarmony(鸿蒙南向开发)——小型系统STM32M…...
网络安全学习(五)Burpsuite实战
bp功能确实强大,记录一个bp手机验证码的实例。 当然,首先要打开bp,设置好浏览器的代理。 浏览器访问实例网址www.xxx.com(隐藏真实网址)。 真实网址有个注册功能,需要手机验证码。 好的,我们…...
ego-planner开源代码之simulator.xml介绍分析
ego-planner开源代码之simulator.xml介绍&分析 1. 源由2. simulator配置2.1 配置入参2.2 mockamap_node 地图生成节点2.3 quadrotor_simulator_so3 四旋翼仿真节点2.4 Nodelet机制 四旋翼控制节点2.5 odom_visualization 里程计数据2.6 pcl_render_node 本地感知 3. 总结 1…...
论文阅读笔记 --- 图模互补:知识图谱与大模型融合综述 --- 按参考文献整理
Large Language Models’ Understanding of Math: Source Criticism and Extrapolation Submitted on 12 Nov 2023大模型在处理结构化推理方面(如解决数学问题[99])表现不佳 Tree of Thoughts: Deliberate Problem Solving with Large Language Models S…...
Cpp类和对象(上)(3)
文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…...
【微信小程序】连续拍照功能实现
前言: 最近在使用uniapp开发微信小程序,遇到这样一个需求,用户想要连续拍照,拍完之后可以删除照片,保留自己想要的照片,然后上传到服务器上。由于原生的方法只能一个个拍照上传,所以只能自己通过…...
JavaSE:11、内部类
学习 资源1 学习资源 2 1、成员内部类 import com.test.*;public class Main {public static void main(String [] argv){Person personnew Person();//Person构造函数Person.Woman womanperson.new Woman();//woman构造函数} }package com.test;public class Person {publ…...
VTD激光雷达(7)——07_OptiX_Variables_Advanced
文章目录 前言一、总结 前言 一、 1 和上图蓝绿的区别在于 总结...
运维工程师面试整理-自动化运维
自动化运维是现代运维工作中不可或缺的一部分,它可以大幅提升效率,减少人为错误,并使得大规模环境管理变得可行。在面试中,面试官通常会通过自动化运维相关的问题来评估你在自动化工具使用、脚本编写、CI/CD 实践以及系统监控等方面的能力。以下是关于自动化运维的详细内容…...
【JAVA基础】实现Tomcat基本功能
文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后,也是大概弄懂了Tomcat是个什么东西,我们在说Tomcat之前,先来了解一下下面这三个东西: TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP(传输控制协议…...
风力发电叶片缺陷检测数据集
风力发电叶片缺陷检测数据集】nc: 4 names: [Burn Mark, Coating_defects, Crack, EROSION ] 名称:【烧伤痕迹, 涂层缺陷, 裂缝,侵蚀】共1095张,8:1:1比例划分,(train;876张,val:109张ÿ…...
数据类型自动转换的解决方案
数据类型自动转换的解决方案 java8、jdk8背景 为方便测试框架数据处理以及方便查看一些数据,弄了一个工具类,部分要点简要说明。 主要涉及到字符串与其他类型的相互转换,无其他类型之间的相互转换。 轻量测试框架实现与使用的总篇可见此文…...
大厂校招:唯品会Java面试题及参考答案
SortedSet 的原理 SortedSet 是一个有序的集合接口,它继承自 Set 接口。在 Java 中,常见的实现类有 TreeSet。 TreeSet 实现了 SortedSet 接口,它使用红黑树来维护集合中元素的有序性。红黑树是一种自平衡的二叉搜索树,具有以下特点: 每个节点要么是红色,要么是黑色。根节…...
Qt常用控件——QLCDNumber
文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件,类似于这样: 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5,in…...
专业学习|GERT网络概览(学习资源、原理介绍、变体介绍)
一、GERT 网络概览 GERT(Graphical Evaluation Review Technique,图示评审技术)是一种结合流线图理论(Flow Graphical Theory)、矩母函数(Moment Generating Function)、计划评审技术(Program Evaluation Review Technique)解决随机网络问题的方法,描述各…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
