Spring Boot中使用YAML配置文件

1. YAML 文件结构和语法

缩进与层次

YAML使用缩进来表示层级关系。每个层级的元素必须比它的父级多一个空格或Tab(推荐使用空格)。例如:

server:port: 8080address: localhost
列表与映射

列表用 - 开头,映射则用 key: value 形式。可以混合使用。

myapp:features:- featureA- featureBsettings:timeout: 30smaxConnections: 50
多行字符串

对于较长的字符串,可以使用 |> 来表示多行文本。|会保留换行符,而>会将多行合并为一行并去掉多余的空白。

message: |这是一个多行字符串。它保留了换行符。
message2: >这也是一个多行字符串。但它的换行符被忽略了。
使用锚点和别名避免重复

为了减少冗余,YAML允许使用锚点(&)和别名(*)来引用之前定义的内容。

defaults: &defaultstimeout: 30sretries: 3service1:<<: *defaultsurl: http://service1.example.comservice2:<<: *defaultsurl: http://service2.example.com

这里,<<: *defaults 表示将 defaults 中的所有属性合并到当前节点中。

2. 多环境配置

激活特定配置文件

你可以通过命令行参数、系统属性或在代码中设置激活的配置文件。

  • 命令行:java -jar app.jar --spring.profiles.active=dev
  • 系统属性:-Dspring.profiles.active=dev
  • 应用程序内:spring.profiles.active=dev
组合配置文件

如果你有多个配置文件,比如 application.ymlapplication-dev.yml,后者会覆盖前者中的相同配置项。

3. 属性占位符和默认值

占位符引用

可以使用 ${} 语法来引用其他属性或环境变量,并可设置默认值。

database:url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/dbname
动态表达式

除了静态替换外,还可以使用 Spring Expression Language (SpEL) 来动态计算值。

maxThreads: '#{T(java.lang.Runtime).getRuntime().availableProcessors() * 2}'

4. 配置类与 @ConfigurationProperties

自定义配置类

创建一个POJO类用于接收配置项,并使用 @ConfigurationProperties 注解绑定到这个类。

@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private String name;private List<String> admins = new ArrayList<>();// getters and setters
}
验证配置

为了确保配置的有效性,可以在配置类上添加JSR-303/Bean Validation注解。

@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {@NotNullprivate String name;@Size(min = 1)private List<String> admins = new ArrayList<>();// getters and setters
}

5. 使用 @Value 注解注入配置

简单注入

直接使用 @Value 注入简单的配置项。

@Component
public class MyComponent {private final String apiKey;public MyComponent(@Value("${myapp.api-key}") String apiKey) {this.apiKey = apiKey;}
}
结合 SpEL 使用

@Value 支持 SpEL 表达式,允许进行更复杂的逻辑操作。

@Value("#{${myapp.timeout} * 1000}")
private int timeoutInMillis;

SpEL不仅限于简单的数学运算,还可以执行条件判断、调用方法等复杂操作。例如:

@Value("#{T(java.lang.Math).random() > 0.5 ? 'high' : 'low'}")
private String randomLevel;
引用其他bean的方法

你可以在表达式中直接引用其他bean的方法:

@Component
public class UtilityService {public String generateToken() {return UUID.randomUUID().toString();}
}@Component
public class MyComponent {@Value("#{@utilityService.generateToken()}")private String token;
}

6. 加密敏感信息

Jasypt

Jasypt 是一个流行的库,用于加密 Spring Boot 应用程序中的敏感数据。你可以在 pom.xml 中添加依赖,并使用它来加密配置项。

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

然后,在配置文件中使用 {cipher} 标签来标记加密过的值。

myapp:secret: ENC(encrypted_value)

要解密这些值,你需要设置 jasypt.encryptor.password 属性来指定加密密码。

jasypt:encryptor:password: my_secret_password

除了前面提到的基本用法,Jasypt还支持多种加密算法以及密钥管理策略。你可以通过配置 jasypt.encryptor.* 属性来自定义加密行为。

jasypt:encryptor:algorithm: PBEWithMD5AndDESpassword: my_secret_passwordiv-generator-classname: org.jasypt.iv.NoIvGenerator

此外,Jasypt也提供了对非对称加密的支持,如RSA。

7. 使用外部化配置

优先级顺序

Spring Boot 按照一定的顺序加载配置源,从命令行参数到默认配置文件。了解这些来源的加载顺序有助于正确地管理和覆盖配置。

  1. 命令行参数
  2. 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中)
  3. 操作系统的环境变量
  4. Java 系统属性 (System.getProperties())
  5. RandomValuePropertySource 配置的随机属性 (random.*)
  6. 打包在 jar 包外的应用配置文件 (application-{profile}.properties 或 .yml)
  7. 打包在 jar 包内的应用配置文件 (application-{profile}.properties 或 .yml)
  8. 配置文件(如 bootstrap.properties 或 bootstrap.yml),适用于微服务架构中的配置服务器
  9. 默认属性(通过 SpringApplication.setDefaultProperties 指定)

8. 高级特性

条件化配置

使用 @ConditionalOnProperty 注解可以根据配置属性的存在与否来有条件地加载bean。

@Bean
@ConditionalOnProperty(name = "myapp.enabled", havingValue = "true")
public MyService myService() {return new MyServiceImpl();
}

除了 @ConditionalOnProperty,还有其他条件注解,如 @ConditionalOnClass, @ConditionalOnMissingBean 等,可以根据类路径上的类、是否存在某些bean等条件来决定是否加载配置。

@Bean
@ConditionalOnClass(name = "com.example.MyLibraryClass")
public MyService myService() {return new MyServiceImpl();
}
使用 EnvironmentPostProcessor 扩展配置处理

为了在应用程序启动前修改环境变量,你可以实现 EnvironmentPostProcessor 接口。例如,根据系统属性动态调整配置文件的位置:

public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {String customConfigLocation = System.getProperty("custom.config.location");if (customConfigLocation != null) {environment.getPropertySources().addFirst(new ResourcePropertySource(customConfigLocation));}}
}

然后注册这个处理器:

spring.application.additional-spring-configuration-metadata=classpath:META-INF/spring-configuration-metadata.json

并且在 META-INF/spring.factories 中声明:

org.springframework.boot.env.EnvironmentPostProcessor=com.example.CustomEnvironmentPostProcessor
配置元数据支持

为了提高开发体验,Spring Boot 提供了对配置元数据的支持,使得IDE能够更好地理解你的配置选项,并提供自动完成等功能。这需要在项目中包含 spring-boot-configuration-processor 依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python模拟练习第一期

问题一 如果一个数 p 是个质数&#xff0c;同时又是整数 a的约数&#xff0c;则 p 称为 a的一个质因数。 请问 2024 有多少个质因数&#xff1f; 步骤 1: 分解 2024 首先&#xff0c;2024 是偶数&#xff0c;说明可以被 2 整除。我们从 2 开始进行除法分解&#xff1a; 202…

element-plus的el-tree的双向绑定

el-tree改造了下 可选可取消 有默认值 不包含父级id&#xff08;也可打开注释 包含父级id&#xff09; 默认展开 点击节点也可触发选择 节点内容自定义 <template><div class"absolute"><el-scrollbar class"pall"><div class"…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 __autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变&#xff0c;ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…

MySQL-DQL之数据多表操作

文章目录 一. 多表操作1. 表与表之间的关系2. 外键约束3. 创建外键约束表(一对多操作) 二. 多表查询1. 多表查询① 交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解]&#xff08;不要记住&#xff09;② 交集运算&#xff1a;内连接查询(join)③ 差集运算&#xff1a;外…

《经验分享 · 软考系统分析师》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

宝塔面板Linux版本常用命令

宝塔面板&#xff08;BT Panel&#xff09;是一款简单易用的服务器管理工具&#xff0c;广泛应用于Linux服务器的管理。尽管宝塔提供了图形化界面&#xff0c;但在某些情况下&#xff0c;使用命令行操作更加高效。以下是宝塔面板Linux版本常用的命令&#xff0c;包括安装、管理…

ElasticSearch - 理解doc Values与Inverted Index倒排索引

文章目录 概述倒排索引&#xff1a;从图书馆的索引卡片谈起倒排索引的工作原理 docValues&#xff1a;从数据库的列式存储说起docValues的工作原理 docValues与倒排索引的对比两者的联系&#xff1a;组合使用&#xff0c;优化搜索与分析 小结 概述 在使用 Elasticsearch 进行大…

2.【每日算法】

1. NC140 排序 题目连接 快排 #include <vector> class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 将给定数组排序* param arr int整型vector 待排序的数组* return int整型vector*/v…

Acer宏碁Swift3笔记本S40-20,SF314-56G原厂Win10系统工厂模式安装包,带Recovery恢复还原

适用电脑型号&#xff1a;S40-20、SF314-56、SF314-56G(原装OEM预装系统) 链接&#xff1a;https://pan.baidu.com/s/1q77Br-hcmn9iJraGVVKQ7Q?pwdrw1r 提取码&#xff1a;rw1r Acer宏碁原装出厂windows10系统自带所有驱动、Office办公软件、出厂主题壁纸、系统属性专属联…

人工智能|自然语言处理——机器翻译评价指标Bleu和Rouge

在机器翻译任务中&#xff0c;BLEU 和 ROUGE 是两个常用的评价指标&#xff0c;BLEU 根据精确率(Precision)衡量翻译的质量&#xff0c;而 ROUGE 根据召回率(Recall)衡量翻译的质量 BLEU&#xff08;Bilingual Evaluation Understudy&#xff09;&#xff1a; BLEU是一种用于评…

Python跳动的爱心

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

极验决策引擎如何凭借独特优势,弯道超车传统风控?

前言 市场上的规则决策引擎产品众多&#xff0c;但大多局限于IP、设备、账号等层面&#xff0c;提供的是现成的风控标签和规则。然而&#xff0c;真正的风控&#xff0c;需要的不仅仅是标签和规则。 极验的业务规则决策引擎与众不同&#xff0c;这款决策引擎以界面流程编排为…

windows如何使用ssh连接kali

声明&#xff1a; 昨天晚上看了小羽老师的直播课&#xff0c;心血来潮自己也想搞一下这个ssh&#xff0c;中途安装遇到了不少问题&#xff0c;电脑也是重启了好多次&#xff0c;遇到bug就重启也是解决bug的一种方法. 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&…

SpringMvc完整知识点一

SpringMVC概述 定义 SpringMVC是一种基于Java实现MVC设计模型的轻量级Web框架 MVC设计模型&#xff1a;即将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这种分离…

路由器、二层交换机与三层交换机的区别与应用

路由器、二层交换机和三层交换机是常见的网络设备&#xff0c;常常协同工作。它们都可以转发数据&#xff0c;但在功能、工作层级以及应用场景上存在差异。 1. 工作层级 三者在OSI模型中的工作层级不同&#xff1a; 路由器&#xff1a; 工作在 网络层&#xff08;第三层&#…

Spring Boot 指定外部配置路径

优先级 外部 > 内部 目录结构&#xff1a; conf/… app.jar 启动命令 java -jar --spring.config.locationfile:/conf/ app.jar

(css)element中el-select下拉框整体样式修改

(css)element中el-select下拉框整体样式修改 重点代码&#xff08;颜色可行修改&#xff09; // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…

「Mac玩转仓颉内测版45」小学奥数篇8 - 排列组合计算

本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题&#xff0c;并加深对数学知识和编程逻辑的理解。 关键词 小学奥数Python Cangjie排列与组合 一、题目描述 编写一个程序&#xff0c;计算从 n 个不同元素中取…

Ungoogled Chromium127编译指南 Windows篇 - 获取源码(七)

1. 引言 在完成所有必要工具的安装和配置后&#xff0c;我们进入了Ungoogled Chromium编译过程的第一个关键阶段&#xff1a;获取源代码。本文将详细介绍如何正确获取和准备Ungoogled Chromium的源代码&#xff0c;为后续的编译工作打下基础。 2. 准备工作 2.1 环境检查 在…