Spring Boot 配置中心与应用属性完美匹配 | 深入探究@ConfigurationProperties与@NacosPropertySource

@ConfigurationProperties

@ConfigurationProperties 注解是 Spring Boot 中用于将外部配置文件(如 YAML 或 properties 文件)中的属性映射到 Java Bean 类属性的强大工具。

以下是关于 @ConfigurationProperties 注解与 YAML 配置文件属性匹配规则的详细说明:

前缀匹配:在 @ConfigurationProperties 注解中,通过 prefix 属性指定了配置文件中属性的前缀。Spring Boot 会查找所有以该前缀开头的属性,并将它们映射到 Java Bean 类的对应属性上。

驼峰命名规则:YAML 配置文件中的属性名通常使用短横线分隔单词(例如 my-property-name),而 Java Bean 类的属性名则遵循驼峰命名规则(例如 myPropertyName)。Spring Boot 会自动将短横线分隔的属性名转换为驼峰命名,并与 Java Bean 类的属性进行匹配。

属性类型转换:Spring Boot 会尝试自动将 YAML 配置文件中的属性值转换为 Java Bean 类属性的相应类型。例如,如果 YAML 文件中有一个字符串值,而 Java Bean 类中的属性是一个 int 类型,Spring Boot 会尝试进行类型转换。如果转换失败,将会抛出异常。

集合类型匹配:当 Java Bean 类的属性是集合类型(如 ListSetMap 等)时,Spring Boot 会尝试将 YAML 配置文件中的数组或列表语法映射到这些集合类型上。通过在 YAML 文件中使用列表(以 - 开头)或映射(key-value 对)语法,可以轻松地为集合类型的属性提供配置值。

默认值:您可以在 Java Bean 类的属性上设置默认值,这样即使 YAML 配置文件中没有指定该属性的值,Java Bean 类的属性也会使用这些默认值。此外,您还可以在 @ConfigurationProperties 注解中指定 ignoreUnknownFields 属性来控制是否忽略配置文件中的未知属性。

下面是一个简单的示例代码,演示了如何使用 @ConfigurationProperties 注解与 YAML 配置文件进行属性匹配:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {private String appName;private int port;private List<String> servers;// 必须提供 getter 和 setter 方法,以便 Spring 能够注入属性值public String getAppName() {return appName;}public void setAppName(String appName) {this.appName = appName;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public List<String> getServers() {return servers;}public void setServers(List<String> servers) {this.servers = servers;}
}

假设在 application.yml 配置文件中定义了如下属性:

myapp:app-name: "My Application"port: 8080servers:- "server1"- "server2"- "server3"

通过以上配置,Spring Boot 会自动将 myapp.app-namemyapp.portmyapp.servers 的值注入到 MyAppProperties 类对应的属性中,无需编写任何额外的配置代码。这使得从配置文件中读取属性变得非常简单和直观。

@NacosPropertySource

@NacosPropertySource 是 Spring Cloud Alibaba Nacos Config 提供的一个注解,它允许开发者从 Nacos 配置中心加载配置,并将这些配置属性注入到 Spring 容器中。这个注解与 Nacos 配置中心中的配置文件有特定的匹配规则,同时它也可以与 @ConfigurationProperties@Value 注解一起使用,以便将配置属性映射到 Java 类中。

Nacos 配置文件命名规则
在 Nacos 配置中心,配置文件的命名通常遵循 {dataId}.{group} 的格式。其中,dataId 是配置的唯一标识符,用于区分不同的配置项;group 是配置的分组,用于对配置进行逻辑上的分类。

@NacosPropertySource 注解使用
在 Spring Boot 应用的启动类或配置类上,你可以使用 @NacosPropertySource 注解来指定要加载的 Nacos 配置文件的 dataIdgroup。这个注解告诉 Spring Boot 从 Nacos 配置中心加载指定的配置文件,并将其内容作为属性源添加到 Spring 环境中。

属性值注入

  • 使用 @Value 注解:你可以在 Java 类的字段上使用 @Value 注解,并通过 ${property.name} 的形式来引用 Nacos 配置中的属性。Spring Boot 会自动将这些属性注入到相应的字段中。

  • 使用 @ConfigurationProperties 注解:对于更复杂的配置,如包含多个属性的对象或集合,你可以使用 @ConfigurationProperties 注解。这个注解允许你将一组相关的配置属性绑定到一个 Java 类上。你需要在类上指定前缀(prefix),Spring Boot 会根据这个前缀从属性源中匹配对应的属性,并自动注入到类的字段中。

示例代码

首先,在 Nacos 配置中心创建一个配置文件,例如 example.properties,内容如下:

# example.properties
app.name=My Application
app.port=8080

然后,在一个配置类中使用 @Value@ConfigurationProperties 注解将属性值注入到 Java 类中:

使用 @Value 注解:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
@NacosPropertySource(dataId = "example.properties", autoRefreshed = true)
public class MyAppProperties {@Value("${app.name}")private String appName;@Value("${app.port}")private int port;// 省略 getter 和 setter 方法
}

通过以上配置,Spring Boot 应用会从 Nacos 配置中心加载 example.properties 文件的配置,并将 app.nameapp.port 的值注入到相应的 Java 类中。当 Nacos 配置中心中的配置发生变化时,如果启用了配置刷新功能(通过 @RefreshScope),应用可以动态地更新这些配置。

注意:如果在配置类当中有配置值(java类),但是配置文件中也有值(yml文件或者nacos配置),会优先优先使用配置文件当中的值。

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

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

相关文章

单片机LED灯闪烁

延时函数计算&#xff08;相关代码生成&#xff09;&#xff1a; #include "reg52.h" #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i 22;j 3;k 227;do{do{while (--k);} while (--j);} while (--i); }vo…

让扣你代码的人电脑关机-js反爬

文案 让扣你代码的人电脑关机&#xff0c;赶紧学起来。众所周知。浏览器中无法导入模块&#xff0c;会报错。nodejs中可以导入模块。那么我们可以在导入语句后加入整蛊代码。在捕获异常后执行正常的代码。那么代码在浏览器中就会正常执行&#xff0c;而当你在本地环境中执行的…

Electron 开发环境搭建指南:从 Node.js 到第一个桌面应用

Electron 开发环境搭建指南&#xff1a;从 Node.js 到第一个桌面应用 第一步&#xff1a;安装Node.js第二步&#xff1a;初始化Electron项目第三步&#xff1a;创建用户界面第四步&#xff1a;运行Electron应用 相信看到这里的小伙伴已经是看到了第一篇对于 Electron 框架的介绍…

Docker常用命令!!!

一、docker基础命令 1、启动docker systemctl start docker 2、关闭docker systemctl stop docker 3、重启docker systemctl restart docker 4、docker设置随服务启动而自启动 systemctl enable docker 5、查看docker 运行状态 systemctl status docker 6、查看docker 版本号信…

Microsoft Edge浏览器Internal Server Error问题解决

网页无法在Microsoft Edge浏览器&#xff0c;尝试Google浏览器可以&#xff0c;排除服务器问题&#xff0c;应该是浏览器本身的问题。 一般这种都是和cookie有关&#xff0c;尝试删除记录 解决&#xff01;

接口、抽象类和内部类

共同点 都不能被实例化都可以包含抽象方法都可以有默认实现的方法 区别 接口主要是对类的行为进行约束&#xff0c;实现了某个接口就具有了对应的行为&#xff1b;抽象类主要用于代码复用&#xff0c;强调的是所属关系一个类只能继承一个类&#xff0c;但可以实现多个接口接…

arm核的DMPIS是如何计算的

直接看这篇&#xff1a;https://zhuanlan.zhihu.com/p/660155292 写的很好&#xff1a; "SA8155P的CPU算力计算如下&#xff08;按照A75性能提升50%来计算&#xff0c;即 5.2 * 1.5 7.8 DMIPS/MHz &#xff09; SA8155P算力 2.419GHz * 1核 * 7.8 DMIPS/MHz 2.131GH…

【MQTT】Vue中使用mqtt

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为一种轻量级、开放、灵活、简单、易于实现的通信协议。它基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的消息传输协议&#xff0c;在上位机和硬件设备间通信时经常用到。虽然在嵌入式软件一…

【图解物联网】第4章 先进的感测技术

4.1 逐步扩张的传感器世界 在前面的章节中&#xff0c;传感器的概念是“用来获取温度和湿度等纯数据的电子零件”。温度传感器和加速度传感器等确实是用来获取简单数据的小零件&#xff0c;我们可以将其理解为构成智能手机等电子设备的一个要素。 然而&#xff0c;随…

分布式文件存储与数据缓存(二)| Redis

目录 Redis概述_什么是NoSQLNoSQL的四大分类KV型NoSql&#xff08;代表----Redis&#xff09;列式NoSql&#xff08;代表----HBase&#xff09;文档型NoSql&#xff08;代表----MongoDB&#xff09;搜索型NoSql&#xff08;代表----ElasticSearch&#xff09; 关系型数据库和非…

Aspose.PDF功能演示:在 JavaScript 中优化 PDF 文件

PDF 文件是一种普遍存在的文档共享格式&#xff0c;但它们有时可能会很大&#xff0c;导致加载时间变慢并增加存储要求。优化 PDF 文件对于确保无缝的用户体验至关重要&#xff0c;尤其是在 Web 应用程序中。因此&#xff0c;在这篇博文中&#xff0c;我们将探讨如何使用 JavaS…

NCV4266ST50T3G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; NCV4266 是一款集成了 150 mA 输出电流的低漏稳压器系列&#xff0c;可用于严酷汽车环境。它包括了较宽的运行温度范围和输出电压范围。该器件提供 3.3 V、5.0 V 固定电压版本&#xff0c;以及可调电压版本&#xff0c;输出电压准确度为 2%。它具有较高的…

IDEA 下载依赖包源码报错 Cannot download sources Sources not found for:XXX

最近在做一个功能的时候想看一个库的源码&#xff0c;结果源码下不下来&#xff0c;报Cannot download sources Sources not found for:XXX,网上搜了半天&#xff0c;也找不到靠谱的结论 后来想了下&#xff0c;应该是镜像那边出了问题&#xff0c;把镜像一删&#xff0c;源码…

HTML静态网页成品作业(HTML+CSS)——非遗徽州木雕网页(6个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

Form当中method的post和get的区别?

1.get是从服务器上获取数据&#xff0c;post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中&#xff0c;值和表单内各个字段一一对应&#xff0c;在URL中可以看到。。post 是通过HTTP post机制&#xff0c;将表单内各个字段与其内容放置在HT…

Linux nginx 域名申请证书后无法使用(无法访问此网站)阿里云域名

首先我们一步排除 1、域名备案是否成功&#xff1f; 网站备案_ICP备案_备案迁移_备案-阿里云 2、域名是否解析&#xff08;我就是错在这里&#xff09; 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 3、是否申请证书成功&#xff1f; 4、nginx是否支持…

將mysql表創建到hive腳本

將mysql表創建到hive腳本 mysql.java import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern;public class mysql {private static String[] deleteArrayNull(String string[]) {ArrayList<String> strList new ArrayList<…

【云原生 • Kubernetes】认识 k8s、k8s 架构、核心实战

文章目录 Kubernetes基础概念1. 是什么2. 架构2.1 工作方式2.2 组件架构 3. k8s组件创建集群步骤一 基础环境步骤二 安装kubelet、kubeadm、kubectl步骤三 主节点使用kubeadm引导集群步骤四 副节点加入主节点步骤五 部署dashboard Kubernetes核心实战1. 资源创建方式2. Namespa…

Beamer模板——基于LaTeX制作学术PPT

Beamer模板——基于LaTeX制作学术PPT 介绍Beamer的基本使用安装和编译用于学术汇报的模板项目代码模板效果图 Beamer的高级特性动态效果分栏布局定理环境 介绍 在学术领域&#xff0c;演示文稿是展示和讨论研究成果的重要方式。传统的PowerPoint虽然方便&#xff0c;但在处理复…

python爬虫之爬虫入门

import requests rrequests.get("http://www.baidu.com") print(r.status_code)#用status_code来确定页面状态是否正常 type(r) r.headers requests库入门 status_code可以用来检验网页状态是否正常type(r)返回r的类型r.headers返回该页面头部信 运行结果如下&#x…