Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties

article/2025/8/26 10:02:00

nacos实现配置文件的热更新,服务不用重启即可读取到nacos配置中心修改发布后的最新值,spring,springboot项目读取本地配置文件的各种方式;文章中介绍了一下注解的使用:@NacosConfigurationProperties,@NacosPropertySource,@ConfigurationProperties,@NacosValue,@value,@RefreshScope,@EnableNacosConfig。
使用nacos的企业越来越多,nacos确实很好用,最近就抽时间研究了一下nacos配置文件的热更新的几种方式,顺便复习了一下读取本地配置文件的几种方式。

文章最后提供源码连接,完全自己写的,绝对可用。

一、nacos配置文件热更新的几种方式

热更新,顾名思义就是在不用重启服务的情况下,实现配置的更新,服务的重启可能对项目的影响很大,所以nacos肯定是支持热更新的,我一共总结了4种方式,可以实现nacos的热更新,网上也找了很多,要么那些文章是从别的地方复制粘贴过来的不能用,要么就是pom依赖不对,总之搞不好,很头疼。所以我自己完整弄一遍(首先要安装好nacos服务端,这里就略过了)。

1、新建项目,pom引入

1、父模块引入pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>NacosConfig</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>NacosValueExample</module></modules><properties><spring-boot.version>2.2.8.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.RELEASE</spring-cloud.version><spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version><nacos-spring-context.version>0.2.2-RC1</nacos-spring-context.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>${nacos-spring-context.version}</version></dependency></dependencies></dependencyManagement></project>

2、子模块引入pom

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId></dependency></dependencies>

3、项目结构
在这里插入图片描述

2、使用@RefreshScope+@Value实现nacos热更新

1、在nacos配置中心新建config-teacher.yaml配置文件
内容如下:

teacher:name: 老李age: 45

在这里插入图片描述
配置编辑保存:
在这里插入图片描述
配置中心已有配置文件了:
在这里插入图片描述
2、项目中新建bootstrap.yml配置文件,将config-teacher.yaml配置进去

spring:application:name: test-configcloud:# nacos 配置nacos:config:file-extension: yamlrefresh-enabled: trueenabled: trueserver-addr: 127.0.0.1:8848group: DEFAULT_GROUP#添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。#group: NACOS-DEMO## 可以配置多个 Data Id 同时配置时,他的优先级关系是 [n]其中 n 的值越大,优先级越高。extension-configs[0]:data-id: config-student.yamlgroup: DEFAULT_GROUPrefresh: trueextension-configs[1]:data-id: config-teacher.yamlgroup: DEFAULT_GROUPrefresh: truediscovery:server-addr: 127.0.0.1:8848

3、启动类

@SpringBootApplication
// 增加@EnableNacosConfig才能使用@NacosValue注解和@NacosConfigurationProperties注解获取nacos配置中心的配置文件内容
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
public class ConfigApplication {public static void main(String[] args) {SpringApplication.run(ConfigApplication.class, args);}
}

4、读取配置文件代码

package com.nacos.example.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;@Component
@RefreshScope
public class TestValue3 {@Value("${teacher.name}")private String name;@Value("${teacher.age}")private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

5、controller注入:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowired
private TestValue3 testValue3;@GetMapping(value = "/getValue9")public Object getValue9() {TestValue3 value3 = new TestValue3();value3.setName(testValue3.getName());value3.setAge(testValue3.getAge());return value3;}}

6、访问接口效果:
在这里插入图片描述
我们修改nacos配置中心的config-teacher.yaml文件
在这里插入图片描述
然后重新访问刚刚的接口,服务不重启:
在这里插入图片描述
可以看到,修改后的配置已经读取到了,第一种方式成功!

3、使用@RefreshScope+@ConfigurationProperties实现nacos热更新

1、配置文件不变,读取配置文件的代码:

@Component
@RefreshScope
@ConfigurationProperties(prefix = "teacher")
public class TestRefreshScope1 {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller注入:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestRefreshScope1 testRefreshScope1;@GetMapping(value = "/getValue5")public Object getValue5() {// 因为RefreshScope使用的动态代理,这里直接返回testRefreshScope1会报错,所以重新new对象从testRefreshScope1获取值在返回//  No serializer found for class org.springframework.context.expression.StandardBeanExpressionResolverTestRefreshScope1 scope1 = new TestRefreshScope1();scope1.setName(testRefreshScope1.getName());scope1.setAge(testRefreshScope1.getAge());return scope1;}}

3、访问接口:
在这里插入图片描述
然后我们修改配置文件的内容:
在这里插入图片描述然后重新访问刚刚的接口,服务不重启:
在这里插入图片描述
已经成功获取到修改后的值。

4、使用@NacosConfigurationProperties实现nacos热更新

1、读取配置代码

@Component
@NacosConfigurationProperties(dataId = "config-teacher.yaml", prefix = "teacher", autoRefreshed = true)
public class TestNacosConfiguration1 {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller注入:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestNacosConfiguration1 testNacosConfiguration1;@GetMapping(value = "/getValue7")public Object getValue7() {return testNacosConfiguration1;}}

3、配置文件不修改,访问接口:
在这里插入图片描述
修改nacos配置文件的内容:
在这里插入图片描述
重新请求接口:
在这里插入图片描述
同样获取到了最新的配置。

5、使用@NacosPropertySource和@ConfigurationProperties实现nacos热更新

1、读取配置的代码:

@Component
@NacosPropertySource(dataId = "config-teacher.yml", autoRefreshed = true)
@ConfigurationProperties(prefix = "teacher")
public class TestConfiguration3 {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller注入:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestConfiguration3 testConfiguration3;@GetMapping(value = "/getValue8")public Object getValue8() {return testConfiguration3;}}

3、访问接口:
在这里插入图片描述
然后我们修改nacos配置中的文件:
在这里插入图片描述
我们重新访问刚刚的接口,服务不重启:
在这里插入图片描述
同样,获取到了最新的nacos配置文件内容。以上就是nacos热更新的4种方式。

二、本地项目配置文件读取的几种方式

注意:需要将nacos相关的配置注释,不然会读取nacos配置中心的文件!这里演示的是读取本地项目的配置文件。

1、使用@Value读取本地配置文件内容

1、新建application.yml配置文件,添加内容:

student:name: 张三age: 20

读取配置文件代码:

@Component
public class TestValue1 {@Value("${student.name}")private String name;@Value("${student.age}")private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller接口:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestValue1 testValue1;@GetMapping(value = "/getValue1")public Object getValue1() {return testValue1;}
}

3、访问接口,获取到配置文件内容:
在这里插入图片描述

2、使用@Value+@PropertySource读取指定配置文件内容

1、新建config2.properties配置文件,添加内容:

teacher.name=李维
teacher.age=32

读取配置文件代码:

@Component
@PropertySource(value = "classpath:config2.properties", encoding = "utf-8")
public class TestValue2 {@Value("${teacher.name}")private String name;@Value("${teacher.age}")private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller接口:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestValue2 testValue2;@GetMapping(value = "/getValue2")public Object getValue2() {return testValue2;}
}

3、访问接口,获取到配置文件内容:
在这里插入图片描述

3、使用@ConfigurationProperties读取配置文件内容

1、application.yml文件不变:

student:name: 张三age: 20

读取配置文件代码:

@Component
@ConfigurationProperties(prefix = "student")
public class TestConfiguration1 {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller接口:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestConfiguration1 testConfiguration1;@GetMapping(value = "/getValue3")public Object getValue3() {return testConfiguration1;}
}

3、访问接口,获取到配置文件内容:
在这里插入图片描述

4、使用@ConfigurationProperties+@PropertySource读取指定配置文件内容

1、config2.properties配置文件不变:

teacher.name=李维
teacher.age=32

读取配置文件代码:

@Component
@PropertySource("classpath:config.properties")
@ConfigurationProperties(prefix = "teacher")
public class TestConfiguration2 {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

2、controller接口:

@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowiredprivate TestConfiguration2 testConfiguration2;@GetMapping(value = "/getValue4")public Object getValue4() {return testConfiguration2;}
}

3、访问接口获取:
在这里插入图片描述

源代码gitee地址:https://gitee.com/wangyi0228/nacos-config.git


http://chatgpt.dhexx.cn/article/MCAwgXvt.shtml

相关文章

Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

JAVA热更新

引言 知识储备先看这篇文章&#xff1a;JAVA Instrument 在这个案例中我们会利用Instrument机制实现一个简单的热更新案例。 总体来说&#xff0c;步骤如下&#xff1a; 创建一个带premain方法的jar包。这个方法定时检测某个文件然后进行热更新。命令行启动业务类时使用参数…

热更新 深度解析

APP热更新方案 为什么要做热更新 当一个App发布之后&#xff0c;突然发现了一个严重bug需要进行紧急修复&#xff0c;这时候公司各方就会忙得焦头烂额&#xff1a;重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。 重点是还会有原来的版本遗留…

webpack热更新

什么是模热更新&#xff1f;有什么优点 模块热更新是webpack的一个功能&#xff0c;它可以使得代码修改之后&#xff0c;不用刷新浏览器就可以更新。 在应用过程中替换添加删出模块&#xff0c;无需重新加载整个页面&#xff0c;是高级版的自动刷新浏览器。 优点&#xff1a…

electron 热更新

1. electron自带的整体更新方式 &#xff08;全量更新&#xff09; 这种方式为electron官方的升级更新方式&#xff0c;主要是通过主进程中的autoUpdater模块进行检测升级更新的&#xff0c;此方式也是大家常见的大多数electron应用程序的更新方式。 检测到新版本后从服务器拉…

uniApp实现热更新

热更新 热更新是开发中常见且常用的一种软件版本控制的方式&#xff0c;在uniapp进行使用热更新将软件实现更新操作 思路: 服务器中存储着最新版本号&#xff0c;前端进行查询可以在首次进入应用时进行请求版本号进行一个匹对如果版本号一致则不提示&#xff0c;反之则提示进行…

Android热更新详解

一 前言介绍 正好最近又看到热更新&#xff0c;对以前Android 热修复核心原理&#xff1a;ClassLoader类加载机制做了点补充。 从16年开始开始&#xff0c;热修复技术开始在安卓界流行&#xff0c;它以classloader类加载机制为核心&#xff0c;可以不发布新版本就修复线上 bu…

热更新原理

对于热更新的问题就是了解两个点的问题&#xff1a; 如何加载补丁包&#xff0c;也就是如何加载dex 文件的过程&#xff08;dex是补丁包&#xff0c;更改的文件都在补丁包中&#xff09;修复后的类如何替换掉旧的类 通过这篇文章给大家介绍下我理解的热更新的逻辑&#xff0c…

Cocos Creator 3.x 热更新

前言&#xff1a;游戏做热更新 是基本需求&#xff1b; 好在 cocos-creator 已经为我们做好了方案&#xff0c;相对于 U3D 的热更新方案来说&#xff0c;使用起来很简便&#xff01;&#xff0c;不用关注很多细节 本文使用的是 cocos-creator 3.5.2 版本 官方文档 &#xff1…

热更新原理及实践注意

首先要说明几个概念&#xff0c;不要混用&#xff0c;热部署&#xff0c;热加载&#xff1b; 热部署&#xff1a;就是已经运行了项目,更改之后,不需要重新tomcat,但是会清空内存,重新打包,重新解压war包运行&#xff0c;可能好处是一个tomcat多个项目,不必因为tomcat停止而停止…

热更新你都知道哪些?

热更新系列目录 热更新你都知道哪些&#xff1f;热更新Sophix的爬坑之路腾讯热更新Tinker的故事阿里热更新Sophix的故事 Android热更新 前言1. 什么是热更新&#xff1f;2. 主流热更新方案3. 腾讯系热更新4. 阿里系热更新总结 博客创建时间&#xff1a;2020.05.16 博客更新时间…

热更新技术简易原理及技术推荐

为了照顾萌新童鞋&#xff0c;最开始还是对热更新的概念做一个通俗易懂的介绍。 热更新用通俗的讲就是软件不通过应用商店的软件版本更新审核&#xff0c;直接通过应用自行下载的软件数据更新的行为。在用户下载安装App之后&#xff0c;打开App时遇到的即时更新&#xff0c;是…

热更新及其原理

热更新&#xff1a;是app常用的更新方式&#xff0c;只需下载安装更新部分的代码 工作原理&#xff1a;动态下开发代码&#xff0c;使开发者在不发布新版本的情况下修复bug和发布功能&#xff0c;绕开苹果审核机制&#xff0c;避免长时间的审核以及多次被拒绝造成的成本。 优…

HTML/CSS实现小米官网搜索框效果

效果图&#xff1a; 需求分析&#xff1a; 1、输入框焦点事件 onfocus:成为焦点, 点击输入框的时候&#xff0c;出现闪烁光标&#xff0c;此时可以输入内容。 onblur :失去焦点, 点击页面空白区域&#xff0c;光标消失。此时不可以输入内容。 2、获取元素 3、注册事件 2.1…

html中的搜索代码,Web自动化(3):网页自动搜索功能

unsplash.jpg 写在前面 如果我们需要在期刊中搜索我们想要找的文章,那么我们如何才能达到这个目的。我们首先看一下,手动和自动对比图: 网页搜索.png 其实内容全部一样,我们只是用自动化程序,来代替我们手动操作。 1. 创建webdriver驱动对象,驱动打开网页 # 导入包 from …

java搜索代码_Java实现搜索功能代码详解

首先&#xff0c;我们要清楚搜索框中根据关键字进行条件搜索发送的是get请求&#xff0c;并且是向当前页面发送get请求 //示例代码 请求路径为当前页面路径 "/product" 当我们要实现多条件搜索功能时&#xff0c;可以将搜索条件封装为一个map集合&#xff0c;再根据m…

干货!最全优秀搜索框设计案例(含代码链接)

面对纷繁复杂的网页内容&#xff0c;用户通过查询关键词表达需求&#xff0c;期望在响应的查询结果中快速获取准确的信息和流畅的用户体验。用户与网络世界的万千联系都是从搜索开始的。搜索框之于用户就像是用户与应用或网站之间的对话窗口。小小的搜索框传递着用户与网站、应…

php网页制作中搜索框的代码,在网页里嵌入百度搜索框功能

今天发现某个网站是直接使用百度搜索作为自己网站的搜索功能的&#xff0c;感觉这个挺好玩的&#xff0c;不需要去研究复杂的搜索算法而又直接使用了百度搜索这个强大的搜索引擎为自己撑腰。无论对自己还是对用户来说都是相当不错的选择&#xff0c;下面作者将要和大家分享一下…

利用CSS写精美搜索框

利用html写搜索样式框 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>8款纯CSS3搜索框</title&g…

JavaScript实现智能搜索框

应用场景&#xff1a; 1. 搜索框在页面中占据的空间过小&#xff0c;希望无论浏览到什么位置&#xff0c;可以轻易地回到并聚焦搜索框。 2. 搜索框里面的文字大小过小&#xff0c;希望能够在上方开辟一块空间放大内容 解决思路&#xff1a; 1. 对整个页面添加键盘事件keyup…