static变量获取nacos配置文件值

问题背景

最近在将配置中心从apollo迁移到Nacos,涉及的一些变量的获取需要修改,这里遇到的问题是static变量使用@Value注解获取,但这里会报空指针错误,如下:

  @Value("${file.server.addr}")private static String serverAddr;

因为用到serverAddr变量的地方在一个静态方法里面,改成非静态变量的话改动成本又比较大,所以考虑需要解决这个问题,尝试检查工具类是否交给了Spring管理,在类上添加@Component或者@Configuration注解,但这样也是不会生效的,原因就是静态成员变量在类加载时就初始化,而此时Nacos的值还未加载或获取到,它会优先于Spring Bean对象的初始化,所以无法注入进去。

解决方案:

1.通过set方法注入

  private static String serverAddr;@Value("${file.server.addr}")public void setServerAddr(String sd){serverAddr = sd;}

2.通过@PostConstruct

  private static String serverAddr;@Value("${file.server.addr}")private String sd;@PostConstructpublic void init(){serverAddr = sd;}

@PostConstruct是Java自带的注解,通常用来执行一些初始化操作,被@PostConstruct修饰的方法需要为非静态的void()方法,会在构造函数执行执行之后执行。

3.通过实现InitializingBean接口

@Component
public class MyUtil implements InitializingBean {private static String serverAddr;@Value("${file.server.addr}")private String sd;@Overridepublic void afterPropertiesSet() throws Exception {serverAddr = sd;}
}

InitializingBean接口是Spring的一个扩展接口,提供了Bean的初始化方法:afterPropertiesSet,从名字上也可看出,方法的执行阶段是在bean的属性被设置值之后,常用来修改默认设置的属性。另外它与Bean中的init-method属性对应的方法功能是一致的,同时它也是在init-method方法前执行。

上面的一些执行时机如下:
Constructor -> @Autowired -> @PostConstruct->afterPropertiesSet

4.SpringContextUtil获取

1)Config.java

@Component
public class FileConfig{@Autowiredprivate ConfigurableApplicationContext configurableApplicationContext;@Value("${file.server.addr:}")private String serverAddr;public String getServerAddr() {return serverAddr =configurableApplicationContext.getEnvironment().getProperty("file.server.addr");}
}

2) SpringContextUtil.java

@Component
public class SpringContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;/*** 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext)throws BeansException {SpringContextUtil.applicationContext = applicationContext;}/*** 取得存储在静态变量中的ApplicationContext.*/public static ApplicationContext getContext() {checkApplicationContext();return applicationContext;}public static Object getBean(String name) throws BeansException{return applicationContext.getBean(name);}private static void checkApplicationContext() {Assert.notNull(applicationContext,"applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil");}
}

3)static调用类

public class TestService {public static void initTest() {FileConfig config = (FileConfig) SpringContextUtil.getBean("fileConfig");...}
}

原来的静态方法里面获取静态变量,可以从Spring容器中的Bean对象获取,变量也封装到了FileConfig类里面,静态方法里面的Bean对象可以通过SpringContextUtil工具类来获取。

注意:
1.这里@Value("${file.server.addr}")里面的变量值要确认存在于Nacos配置文件当中并确保格式正确;
2.SpringContextUtil如果里面applicationContext 有空指针问题,请检查SpringContextUtil 有没有被Spring扫描到;

总结

static方法修饰的静态变量从配置文件中获取,用到的地方还是挺多的,比如在一些工具类当中,通常这些工具类里面的变量是全局的,在很多地方都有调用。这里1/2/3方案都是先将Spring对象中的变量加载完成后,再主动将值赋值给静态变量实现的,因为只加载一次,所以当Nacos配置文件中值更新的时候,我们需要重启服务才能生效。

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

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

相关文章

【软考】设计模式之策略模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. 适用性 1. 说明 1.定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。2.此模式使得算法可以独立于使用它们的客户而变化。3.策略模式(Strategy Pattern…

《HCIP-openEuler实验指导手册》1.7 Apache虚拟主机配置

知识点 配置步骤 需求 域名访问目录test1.com/home/source/test1test2.com/home/source/test2test3.com/home/source/test3 创建配置文件 touch /etc/httpd/conf.d/vhost.conf vim /etc/httpd/conf.d/vhost.conf文件内容如下 <VirtualHost *.81> ServerName test1.c…

CONSOB 又下令封锁5个未经授权的投资网站,总数达1065

FX110讯&#xff1a;意大利金融市场监管局 CONSOB 已下令关闭 5 个非法提供金融服务/金融产品的网站。自2019年7月CONSOB有权下令封锁欺诈性金融网站以来&#xff0c;被封禁的网站数量已升至1065个。 以下是 CONSOB 下令新屏蔽的 5个网站&#xff1a; “Luno Invest” Vantage …

JSP:操作指令

目录 1.jsp:useBean操作 语法格式&#xff1a; 属性说明&#xff1a; scope作用域&#xff1a; 1.page&#xff1a; 2.request&#xff1a; 3.session&#xff1a; 4.application 案例&#xff1a; 2.jsp:setProperty操作 语法格式&#xff1a; 属性说明&#xf…

图像和图像处理

在探索图像处理和其他计算机视觉功能之前,在计算机程序的数据上下文中考虑图像实际是什么会非常有用。 图像是像素数组 对于计算机而言,图像是数字像素值的数组。 例如,请考虑以下数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 255 255 255 0 00&…

吾日三省吾身---对平常遇到的错误总结

✨个人主页&#xff1a; 不漫游-CSDN博客 前言 本篇文章是对平常练习遇到的问题总结&#xff0c;多吸取经验教训才能避免未来再犯~ Java语法部分 &#xff08;一&#xff09;多态 思考&#xff1a;这道题很明显考察的是多态的知识点&#xff0c;即一个对象可以被赋值给其父类…

【PyTorch 实战3:YOLOv5检测模型】10min揭秘 YOLOv5 检测网络架构、工作原理以及pytorch代码实现(附代码实现!)

YOLOv5简介 YOLOv5&#xff08;You Only Look Once, Version 5&#xff09;是一种先进的目标检测模型&#xff0c;是YOLO系列的最新版本&#xff0c;由Ultralytics公司开发。该模型利用深度学习技术&#xff0c;能够在图像或视频中实时准确地检测出多个对象的位置及其类别&…

鸿蒙内核源码分析(时钟任务篇)

时钟概念 时间是非常重要的概念&#xff0c;我们整个学生阶段有个东西很重要,就是校园铃声. 它控制着上课,下课,吃饭,睡觉的节奏.没有它学校的管理就乱套了,老师拖课想拖多久就多久,那可不行,下课铃声一响就是在告诉老师时间到了,该停止了让学生HAPPY去了. 操作系统也一样&…

LLM大语言模型(十三):ChatGLM3-6B兼容Langchain的Function Call的一步一步的详细转换过程记录

# LangChain&#xff1a;原始prompt System: Respond to the human as helpfully and accurately as possible. You have access to the following tools: Calculator: Useful for when you need to calculate math problems, args: {\calculation\: {\description\: \calcul…

打地鼠游戏(python期中)

考点&#xff1a; 随机数库&#xff1a;random 时间函数库&#xff1a;time 注意与日期函数库&#xff08;datetime&#xff09;区分 代码实现 import random import timedef display_holes(hole_index):holes [* if i ! hole_index else o for i in range(1, 11)]prin…

自动化爬虫工具:you-get安装与使用

Windows下的安装命令&#xff1a; pip install you-get linux下的安装命令&#xff1a; pip3 install you-get 下载完成后&#xff0c;我们可以看到如下的警告&#xff0c;意思就是这个工具并未被添加到环境变量中&#xff0c;如果我们想在命令行中直接调用&#xff0c;需要…

IOS 纯代码自定义UIView案例

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGINinterface OrderAfterPeriodSelectNumView : UIView //左边标题 property (nonatomic,strong) UILabel *titleLab; //数量 property (nonatomic,strong) UILabel *numLab;end #import "OrderAfterPeriodSelectNumVie…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单&#xff0c;我用的是vim-plug&#xff0c;网络上随便一搜应该就有很多教程&#xff0c;而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

2024年电子商务与大数据经济国际会议 (EBDE 2024)

2024年电子商务与大数据经济国际会议 (EBDE 2024) 2024 International Conference on E-commerce and Big Data Economy 【会议简介】 2024年电子商务与大数据经济国际会议即将在厦门召开。本次会议旨在汇聚全球电子商务与大数据经济领域的专家学者&#xff0c;共同探讨电子商务…

nacos-redis-springboot

新项目 准备工作 nacos 版本 2.0.3 redis 最终版本说明 springcloud-alibaba&#xff1a;2.2.7RELEASE springcloud&#xff1a;Hoxton.SR12 springboot&#xff1a;2.3.12.RELEASE Nacos&#xff1a;2.0.3 步骤 启动nacos和redis 准备nacos配置文件 server: port…

使用frp实现内网穿透教程

文章目录 简介frp 是什么&#xff1f;为什么选择 frp&#xff1f; 概念工作原理代理类型 内网穿透教程服务端安装和配置本地Windows&#xff08;客户端&#xff09;安装和配置本地Linux虚拟机&#xff08;客户端&#xff09;安装和配置使用 systemd 管理服务端注意事项 简介 f…

埃氏筛选-判断素数

核心思路如下&#xff1a; 初始化&#xff1a;创建一个布尔数组 isshushu&#xff0c;其长度等于要检查的数 n。这个数组用于标记每个数是否为质数&#xff0c;初始时所有数都假设为质数&#xff08;即数组元素均为 false&#xff09;。 筛选&#xff1a;从最小的质数2开始&a…

GPT学术优化推荐(gpt_academic )

GPT学术优化 (GPT Academic):支持一键润色、一键中英互译、一键代码解释、chat分析报告生成、PDF论文全文翻译功能、互联网信息聚合GPT等等 ChatGPT/GLM提供图形交互界面&#xff0c;特别优化论文阅读/润色/写作体验&#xff0c;模块化设计&#xff0c;支持自定义快捷按钮&…

在线培训考试系统在线考试功能注意事项

在线培训考试系统在线考试功能注意事项 考试前务必注意是否开启防切屏、摄像头监考等防作弊措施&#xff0c;系统一旦检测到触发了疑似作弊行为会立刻自动交卷&#xff0c;考试终止&#xff1b; 答题者准备好后&#xff0c;可点击“开始答题”按钮进入考试&#xff0c;注意考…

【Vue】如何创建一个Vue-cli程序

一、准备工作 1、下载Node.js 官网地址 https://nodejs.org/en 2、查看版本 cmd下通过node-v,查看版本号&#xff1b; cmd下通过npm-v,查看是否打印版本号。 3、安装淘宝加速器 npm install cnpm -g 4、安装Vue-cli cnpm install vue-cli -g 二、创建Vue程序 1、创建一个V…