论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
01.SpringBoot开发杂记-使用工具类,静态读取设置文件中 ...
01.SpringBoot开发杂记-使用工具类,静态读取设置文件中的设置的写法 ...
梦见你的名字
金牌会员
|
2024-9-27 14:16:26
|
显示全部楼层
|
阅读模式
楼主
主题
970
|
帖子
970
|
积分
2910
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
使用工具类,静态读取设置文件中的设置的写法
@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
@Resource
private Environment environment;
public static void main(String[] args) {
SpringApplication.run(XxxApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
ConfigUtils.init(environment);
}
}
复制代码
这样,就能保证,动态革新后,使用ConfigUtils获取设置,获取到最新的。
只是为了记录自己的学习历程,且本人程度有限,不对之处,请指正。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
梦见你的名字
金牌会员
这个人很懒什么都没写!
楼主热帖
【docker系列】四种基础网络模式及自定 ...
MySQL高可用架构搭建实战
小白怎么入门网络安全?看这篇就够啦! ...
kubernetes常用命令-1-命令补全 ...
1.1 大数据简介-hadoop-最全最完整的保 ...
'林子雨大数据' 实验3 HBase操 ...
Cilium系列-9-主机路由切换为基于 BPF ...
北京智游科技(爱加密)-渗透测试实习 ...
这些行业注意了:“谨防互联网门户钓鱼 ...
Xcode Run Script 脚本
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Oracle
快速回复
返回顶部
返回列表