01.SpringBoot开发杂记-使用工具类,静态读取配置文件中的配置的写法

news/2024/9/27 15:21:50

使用工具类,静态读取配置文件中的配置的写法

@Component
public class ConfigUtils {private static ConfigUtils instance;//单例模式持有当前工具类的实例private ConfigUtils(){}@Value("${system.uploadPath}")private String uploadPath;//@Value注解读取配置,为类对象的属性@Value("${basicLog}")private String basicLog;@PostConstruct//在创建类对象后,执行一些操作public void init(){instance = this;//将IOC容器自动创建的工具类的bean实例对象,配置为单例持有的对象}public static String getUploaderRootPath(){//提供获取配置的静态方法return instance.uploadPath;}public static String getBasicLog(){return instance.basicLog;}}

如果是单体架构的项目,上面的代码,已经能够实现了,无外乎就是多设置几个属性,或者属性很多的话,使用@ConfigurationProperties(prefix = "xxx"),的方式,统一赋值,减少手写@Value注解。

注意,微服务架构的话,以上写法,可能会导致一个问题,就是这些配置,可能会存在滞后性。因为上述代码,本质是Spring扫描到ConfigUtils类的@Component注解,并生成对象时,@Value注解,从配置文件中,读取配置,并设置属性。在对象创建完毕,依赖注入完毕后,执行到@PostConstruct修饰的init初始化方法时,将IOC容器中的ConfigUtils对象,赋给instance。但是,当在微服务架构中,在配置中心,修改配置文件,并开启了动态刷新功能,虽然动态刷新,可以刷新到环境Environment,但是却无法修改,最初IOC容器中的this对象,这也就导致,看似刷新了配置中心中的配置,但是使用ConfigUtils.getUploaderRootPath()方法,获取到的配置,依旧是,应用启动时,读取到的旧的配置。

问题是,如何在保证在配置中心的配置文件修改后,能够保证使用ConfigUtils获取到最新的配置呢?

1.要么就是,每次配置文件刷新后,都将配置重新刷新到配置类的属性上。

这个很难实现,因为无法控制,什么时候刷新,以及刷新那些类的属性。也可能是我的技术水平,不高,所以对这一条解决方法,没有思路。

2.要么就是,每次获取属性时,都获取最新的(每次获取配置时,都使用Environment进行获取)。

public class ConfigUtils {private static Environment environment;private ConfigUtils(){}//    private String uploadPath;
//
//    private String basicLog;public static void init(Environment env){environment = env;}public static String getUploaderRootPath(){return environment.getProperty("upload_path");}public static String getBasicLog(){return environment.getProperty("basicLog");}}

但是上面代码,很明显是错误的,因为没有为environment赋值,什么时候,赋值呢?当然是配置文件中的配置都写入到Environment存放在IOC容器中之后,鉴于配置写入完成时,没有一个标志。可以使用应用启动完成后,再进行赋值,此时肯定写入完成了。主启动类实现CommandLineRunner接口,重写run(String... args)方法,在其中定义应用启动完成后,执行后续的一些操作。

@...(注解省略了)
public class XxxApplication implements CommandLineRunner { #org.springframework.boot.CommandLineRunner@Resourceprivate Environment environment;public static void main(String[] args) {SpringApplication.run(XxxApplication.class, args);}@Overridepublic void run(String... args) throws Exception {ConfigUtils.init(environment);}}

这样,就能保证,动态刷新后,使用ConfigUtils获取配置,获取到最新的。

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

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

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

相关文章

PARTV-Oracle实例架构-内存架构

14. 内存架构 14.1. Oracle是数据库内存结构简介 当实例启动时,Oracle数据库会分配一个内存区域并启动后台进程。这个内存区域存储以下信息:程序代码 每个已连接会话的信息,即使它当前未活跃 程序执行期间需要的信息,例如,正在从中提取行的查询的当前状态 锁数据等在进程间…

【微服务】一张图搞懂微服务架构设计

1.前言 当前,微服务架构在很多公司都已经落地实施了,下面用一张图简要概述下微服务架构设计中常用组件。不能说已经使用微服务好几年了,结果对微服务架构没有一个整体的认知,一个只懂搬砖的程序员不是一个好码农! 2.流量入口 Nginx 在上图中可以看到,Nginx 作为整个架构的…

【性能测试】关于性能测试的各种指标

本指标适用于使用性能测试进行性能测试项目技术质量评价依据,规范技术测试结果评价,统一性能测试技术测试质量度量。应用系统技术质量度量指标范围广泛,本文难以涵盖全部。 预期读者为测试管理人员、测试实施人员、技术支持人员、项目管理人员等系统技术质量相关人员。 1.系…

使用VSCode进行Qt开发插件QtSupport

使用VSCode进行Qt开发 插件Qt Support 使用VSCode进行Qt开发一般都是使用的官方插件Qt tools,使用起来并不是太方便,所以我选择Qt Support插件。 一、Qt Support功能可以创建项目 导入基于CMake的qt项目 可以添加Qt项目文件Designer Form Class Designer Form C++ class Tran…

给Java同仁单点的AI开胃菜--搭建一个自己的本地问答系统

这是我参与创作者计划的第1篇文章大家好,因为对AI大模型很感兴趣,相信很多兄弟们跟我一样,所以最近花时间了解了一些,有一些总结 分享给大家,希望对各位有所帮助;本文主要是目标是 讲解如何在本地 搭建一个简易的AI问答系统,主要用java来实现,也有一些简单的python知识…

MySQL 表的CRUD与复合查询

目录表的增删改查Create指定列插入单行数据+全列插入多行数据+全列插入插入否则更新替换 (replace)Retrieve标准语法SELECT列全列查询限制显示条目 limit (分页查询)基本语法:指定列查询select 查询字段为表达式表达式重命名去重WHERE 条件比较运算符逻辑运算符案例:结果排序 O…

PbootCMS提示:URL名称与模型URL名称冲突,请换一个名称!

解决办法找到模型管理,编辑对应模型把url名称修改为其他,例如:新闻栏目需要news,这里就可以修改成article或者news-model,然后栏目那边就可以使用news名称了。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Jav…

远程控制除了工作还能玩游戏陪伴家人?ToDesk也太方便了!

现如今的当代人已经离不开各种电子设备,打工人更是经常需要手机电脑ipad多种工具齐上阵。 但总是会有各种突发的工作,电脑又不能随时都带在身上,这时候就需要好用的远程控制软件ToDesk来帮你啦~ 经过小编对ToDesk的深度使用过后,总结了三种使用模式体验,可以完美解决我们的…