Spring Boot中使用YAML配置文件

news2024/12/12 13:14:50

1. YAML 文件结构和语法

缩进与层次

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

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

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

myapp:
  features:
    - featureA
    - featureB
  settings:
    timeout: 30s
    maxConnections: 50
多行字符串

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

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

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

defaults: &defaults
  timeout: 30s
  retries: 3

service1:
  <<: *defaults
  url: http://service1.example.com

service2:
  <<: *defaults
  url: 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 {
    @NotNull
    private 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: PBEWithMD5AndDES
    password: my_secret_password
    iv-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 {
    @Override
    public 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.coloradmin.cn/o/2258253.html

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

相关文章

交换排序(Swap Sort)详解

交换排序Swap Sort详解 冒泡排序冒泡算法代码实现冒泡分析 快速排序快排算法代码实现快排分析 交换类排序主要是通过两两比较待排元素的关键字&#xff0c;若发现与排序要求相逆&#xff0c;则交换之。在这类排序方法中最常见的是起泡排序&#xff08;冒泡排序&#xff09;和快…

MySQL追梦旅途之性能优化

1、索引优化 索引可以显著加速查询操作&#xff0c;但过多或不适当的索引也会带来负面影响&#xff08;如增加写入开销&#xff09;。因此&#xff0c;选择合适的索引至关重要。 创建索引&#xff1a; 为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。 CREATE I…

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …

解决阿里云轻量级服务器 Ubuntu 24.04.1 LTS 没网也 ping 不通 8.8.8.8 以及 route -n 没有输出任何转发信息

事情发生在两天前&#xff0c;位于公网的阿里云轻量级服务器&#xff08;Ubuntu 24.04.1 LTS&#xff09;忽然没网。主要是上次上服务器进行配置已经是一个多月前&#xff0c;最近也没有做什么事情&#xff0c;就忽然没网了&#xff0c;让人纳闷。更主要的是&#xff0c;上次备…

Cesium中实现仿ArcGIS三维的动态图层加载方式

Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层&#xff0c;你会发现&#xff0c;Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题&#xff1a; 请求量大&#xff0c;…

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能&#xff0c;本文向你展示其数据可视化功能&#xff0c;并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分&#xff0c;无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…

智慧商城项目2(vue核心技术与实战)

页面访问拦截了解 router/index.js import Vue from vue import VueRouter from vue-router import Login from /views/login import Layout from /views/layout import Search from /views/search import SearchList from /views/search/list import Prodetail from /views/…

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…

华为云域名网站,域名切换到Cloudflare CDN出现访问报错:DNS 重定向次过多

网站域名切换到Cloudflare出现访问报错&#xff1a;重定向次过多&#xff0c;应该如何处理&#xff1f; 最近我自己已经遇到很多次这个情况了&#xff0c;将网站域名DNS切换到Cloudflare之后&#xff0c;网站会打不开&#xff0c;出现重定向次数过多报错。 网站域名切换到Clo…

颜色的基本处理

数码相机能够获取彩色图像&#xff0c;但相机的色彩处理是一个非常复杂的过程&#xff0c;是非常重要的。 此过程生产制造商在细节方面都是不公布的&#xff0c;但是基本的概念是相同的。当相机捕捉一个真实场景时&#xff0c;是怎么还原成人眼所看到的图像呢&#xff1f; 1.R…

与 Cursor AI 对话编程:2小时开发报修维修微信小程序

本文记录了如何通过与 Cursor AI 对话&#xff0c;全程不写一行代码的情况下&#xff0c;完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们&#xff1a; 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图&#xff1a; 一、项目配置 首先我是这样和 AI 对…

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1&#xff1a;“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间&#xff0c;出现未经处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细…

leetcode909:蛇梯棋

给你一个大小为 n x n 的整数矩阵 board &#xff0c;方格按从 1 到 n2 编号&#xff0c;编号遵循 转行交替方式 &#xff0c;从左下角开始 &#xff08;即&#xff0c;从 board[n - 1][0] 开始&#xff09;的每一行改变方向。 你一开始位于棋盘上的方格 1。每一回合&#xf…

【特殊子序列 DP】力扣552. 学生出勤记录 II

可以用字符串表示一个学生的出勤记录&#xff0c;其中的每个字符用来标记当天的出勤情况&#xff08;缺勤、迟到、到场&#xff09;。记录中只含下面三种字符&#xff1a; ‘A’&#xff1a;Absent&#xff0c;缺勤 ‘L’&#xff1a;Late&#xff0c;迟到 ‘P’&#xff1a;Pr…

Datawhale AI 冬令营(第一期)定制你的第一个专属模型-学习笔记

最近我报名参加了Datawhale组织的主题为“动手学系列&#xff0c;人人都能应用的AI”的Datawhale AI冬令营&#xff08;第一期&#xff09;。 本次学习一共12天&#xff0c;从12月10日-12月21日&#xff0c;学习会包含【跑通速通手册】&#xff0c;【学习大模型微调&数据集…

【GL009】C/C++总结(一)

自查目录 1. typedef 和 #define 的区别 2. const 、volatile 和 static 的区别 3. const修饰指针 4. 数组指针和指针数组 5. 函数指针和指针函数 6. C/C内存管理 6.1 内存分布图解 6.2 C语言中的内存分配方式 6.3 堆&#xff08;Heap&#xff09;和栈&#xff08;Sta…

opencv库中的函数应用

opencv库中的函数应用 二值化函数功能参数返回值应用例子 自适应二值化函数功能参数返回值应用例子 腐蚀函数功能参数返回值应用例子 膨胀函数功能参数返回值例子 仿射变换函数功能参数返回值例子 透视变换函数功能参数返回值例子 二值化函数 函数&#xff1a;cv2.threshold(i…

HBuilderX(uni-app)Vue3路由传参和接收路由参数!!

uni-app搭建小程序时候Vue3语法接收路由参数&#xff0c;去官方文档查看&#xff0c;是onLoad的option接收参数&#xff0c;我试过&#xff0c;接收不到&#xff0c;上网查各种方法也是不太行&#xff0c;最后自己琢磨出来了&#xff0c;这参数藏得还挺深&#xff01;&#xff…

设置docker镜像加速器

阿里云镜像中心 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登陆阿里云账号后&#xff0c;可以看到镜像加速器的配置&#xff0c;如下图所示 参考文章地址 Docker 镜像库国内加速的几种方法_docker 加速-CSDN博客