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

SpringBoot 读取配置文件的4种方式

文章目录

  • 1. @Value 注解读取单个属性
  • 2. 使用 @ConfigurationProperties 注解
  • 3. 通过 Environment 对象读取属性
  • 4. 使用 @PropertySource 注解加载额外的配置文件

在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/main/resources 目录下的 application.propertiesapplication.yml 文件中读取配置。读取 application.yml 文件中的配置可以通过以下几种常用的方法进行:

  1. @Value: 适合读取简单的单一属性。
  2. @ConfigurationProperties: 适合读取复杂的配置集。
  3. Environment: 适合在运行时动态访问配置。
  4. @PropertySource: 加载 .properties 文件。

1. @Value 注解读取单个属性

@Value 注解用于读取单一简单的配置属性,该注解可以直接应用于字段、构造函数或方法参数上,不要求提供 Setter 方法。

  1. application.yml 配置文件中添加如下配置:

    app:name: MyAppkeys:- key1- key2
    
  2. 使用 @Value 注解从配置文件中读取单个属性值:

    1. 字段注入:将 @Value 注解应用于字段,Spring 将直接将配置值注入到字段中。

      @Component
      public class MyComponent {@Value("${app.name}")private String name;}
      
    2. 构造函数注入@Value 也可以用于构造函数参数。

      @Component
      public class MyComponent {private final String name;public MyComponent(@Value("${app.name}") String name) {this.name = name;}}
      
    3. 方法参数注入@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 对象中。适合处理结构化的配置,比如嵌套的属性或复杂的属性集合。

  1. application.yml 配置文件中添加如下配置:

    app:name: MyAppkeys:- key1- key2
    
  2. 在类上使用 @ConfigurationProperties 注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:

    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {private List<String> keys;}
    

注意:@ConfigurationProperties 读取配置时需要确保配置文件中的属性名与 Java 类中的属性名匹配。

3. 通过 Environment 对象读取属性

Environment 是 Spring 中用于管理和访问配置属性、配置文件和环境变量的一个抽象接口,该对象提供了一种管理和访问配置属性、激活的配置文件和环境变量的统一方式。我们可以在任何 Spring 管理的 bean 中通过注入 Environment 对象来获取配置属性。

  1. application.yml 配置文件中添加如下配置:

    app:name: MyAppkeys:- key1- key2
    
  2. 在类中注入 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] 对应 key1
  • app.keys[1] 对应 key2
  • app.keys[2] 对应 key3

因此对于复杂配置需要特殊处理,例如获取集合元素需要使用类似数组索引的语法来访问 YAML 文件中的列表元素。

4. 使用 @PropertySource 注解加载额外的配置文件

@PropertySource 注解是 Spring Framework 提供的一个注解,用于加载额外 .properties 配置文件或其他资源文件中的属性到 Spring 的 Environment 中。

  1. src/main/resources 目录下创建 config.properties 的属性文件:

    app.name=MyApp
    app.version=1.0.0
    
  2. 在配置类上使用 @PropertySource 注解来加载配置文件:

    @Configuration
    @PropertySource("classpath:config.properties")
    //@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
    public class AppConfig {}
    
  3. 使用 @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"})
  1. 路径classpath: 前缀表示文件在类路径中。如果文件位于文件系统的其他位置,你可以使用文件系统路径,例如 file:/path/to/config.properties
  2. 覆盖@PropertySource 加载的属性文件中的属性会覆盖同名的系统属性,但不会覆盖由 Spring Boot 的 application.propertiesapplication.yml 文件中定义的属性。
  3. 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。

相关文章:

SpringBoot 读取配置文件的4种方式

文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中&#xff0c;application.yml 文件用于配置应用程序的属性&#xff0c;Spring Boot 默认会从 src/…...

【车载开发系列】ParaSoft单元测试环境配置(三)

【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…...

如何让Threejs的canvas背景透明?

在Three.js中&#xff0c;要让Canvas的背景透明&#xff0c;只显示场景中的模型或物体&#xff0c;有两个关键点&#xff1a; 一、对渲染器&#xff08;Renderer&#xff09;进行alpha为true配置&#xff1b; 二、通过CSS设置&#xff0c;使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协议中的优化算法&#xff0c;旨在减少小数据包的数量&#xff0c;从而减少网络拥塞的可能性。该算法规定&#xff0c;在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后&#xff0c;如果收到确认&#xff08;ACK&#xff09;之前&#x…...

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)

往期知识点记录&#xff1a; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——Combo解决方案之W800芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统STM32M…...

网络安全学习(五)Burpsuite实战

bp功能确实强大&#xff0c;记录一个bp手机验证码的实例。 当然&#xff0c;首先要打开bp&#xff0c;设置好浏览器的代理。 浏览器访问实例网址www.xxx.com&#xff08;隐藏真实网址&#xff09;。 真实网址有个注册功能&#xff0c;需要手机验证码。 好的&#xff0c;我们…...

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大模型在处理结构化推理方面&#xff08;如解决数学问题[99]&#xff09;表现不佳 Tree of Thoughts: Deliberate Problem Solving with Large Language Models S…...

Cpp类和对象(上)(3)

文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…...

【微信小程序】连续拍照功能实现

前言&#xff1a; 最近在使用uniapp开发微信小程序&#xff0c;遇到这样一个需求&#xff0c;用户想要连续拍照&#xff0c;拍完之后可以删除照片&#xff0c;保留自己想要的照片&#xff0c;然后上传到服务器上。由于原生的方法只能一个个拍照上传&#xff0c;所以只能自己通过…...

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 在搜索了两三天之后&#xff0c;也是大概弄懂了Tomcat是个什么东西&#xff0c;我们在说Tomcat之前&#xff0c;先来了解一下下面这三个东西&#xff1a; TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP&#xff08;传输控制协议…...

风力发电叶片缺陷检测数据集

风力发电叶片缺陷检测数据集】nc: 4 names: [Burn Mark, Coating_defects, Crack, EROSION ] 名称&#xff1a;【烧伤痕迹, 涂层缺陷, 裂缝&#xff0c;侵蚀】共1095张&#xff0c;8:1:1比例划分&#xff0c;&#xff08;train;876张&#xff0c;val&#xff1a;109张&#xff…...

数据类型自动转换的解决方案

数据类型自动转换的解决方案 java8、jdk8背景 为方便测试框架数据处理以及方便查看一些数据&#xff0c;弄了一个工具类&#xff0c;部分要点简要说明。 主要涉及到字符串与其他类型的相互转换&#xff0c;无其他类型之间的相互转换。 轻量测试框架实现与使用的总篇可见此文…...

大厂校招:唯品会Java面试题及参考答案

SortedSet 的原理 SortedSet 是一个有序的集合接口,它继承自 Set 接口。在 Java 中,常见的实现类有 TreeSet。 TreeSet 实现了 SortedSet 接口,它使用红黑树来维护集合中元素的有序性。红黑树是一种自平衡的二叉搜索树,具有以下特点: 每个节点要么是红色,要么是黑色。根节…...

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件&#xff0c;类似于这样&#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5&#xff0c;in…...

专业学习|GERT网络概览(学习资源、原理介绍、变体介绍)

一、GERT 网络概览 GERT(Graphical Evaluation Review Technique&#xff0c;图示评审技术)是一种结合流线图理论(Flow Graphical Theory)、矩母函数(Moment Generating Function)、计划评审技术(Program Evaluation Review Technique)解决随机网络问题的方法&#xff0c;描述各…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...