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

打印 上一主题 下一主题

主题 828|帖子 828|积分 2484

使用工具类,静态读取设置文件中的设置的写法
  1. @Component
  2. public class ConfigUtils {
  3.     private static ConfigUtils instance;//单例模式持有当前工具类的实例
  4.     private ConfigUtils(){}
  5.     @Value("${system.uploadPath}")
  6.     private String uploadPath;//@Value注解读取配置,为类对象的属性
  7.        
  8.   
  9.     @Value("${basicLog}")
  10.     private String basicLog;
  11.    
  12.     @PostConstruct//在创建类对象后,执行一些操作
  13.     public void init(){
  14.         instance = this;//将IOC容器自动创建的工具类的bean实例对象,配置为单例持有的对象
  15.     }
  16.     public static String getUploaderRootPath(){//提供获取配置的静态方法
  17.         return instance.uploadPath;
  18.     }
  19.    
  20.     public static String getBasicLog(){
  21.         return instance.basicLog;
  22.     }
  23. }
复制代码
如果是单体架构的项目,上面的代码,已经能够实现了,无外乎就是多设置几个属性,或者属性许多的话,使用@ConfigurationProperties(prefix = "xxx"),的方式,统一赋值,淘汰手写@Value注解。
注意,微服务架构的话,以上写法,可能会导致一个问题,就是这些设置,可能会存在滞后性。因为上述代码,本质是Spring扫描到ConfigUtils类的@Component注解,并生成对象时,@Value注解,从设置文件中,读取设置,并设置属性。在对象创建完毕,依靠注入完毕后,执行到@PostConstruct修饰的init初始化方法时,将IOC容器中的ConfigUtils对象,赋给instance。但是,当在微服务架构中,在设置中心,修改设置文件,并开启了动态革新功能,虽然动态革新,可以革新到环境Environment,但是却无法修改,最初IOC容器中的this对象,这也就导致,看似革新了设置中心中的设置,但是使用ConfigUtils.getUploaderRootPath()方法,获取到的设置,依旧是,应用启动时,读取到的旧的设置。
问题是,如何在保证在设置中心的设置文件修改后,能够保证使用ConfigUtils获取到最新的设置呢?
1.要么就是,每次设置文件革新后,都将设置重新革新到设置类的属性上。
这个很难实现,因为无法控制,什么时候革新,以及革新那些类的属性。也可能是我的技能程度,不高,所以对这一条办理方法,没有思路。
2.要么就是,每次获取属性时,都获取最新的(每次获取设置时,都使用Environment举行获取)。
  1. public class ConfigUtils {
  2.     private static Environment environment;
  3.     private ConfigUtils(){}
  4. //    private String uploadPath;
  5. //
  6. //    private String basicLog;
  7.     public static void init(Environment env){
  8.         environment = env;
  9.     }
  10.     public static String getUploaderRootPath(){
  11.         return environment.getProperty("upload_path");
  12.     }
  13.     public static String getBasicLog(){
  14.         return environment.getProperty("basicLog");
  15.     }
  16. }
复制代码
但是上面代码,很明显是错误的,因为没有为environment赋值,什么时候,赋值呢?固然是设置文件中的设置都写入到Environment存放在IOC容器中之后,鉴于设置写入完成时,没有一个标志。可以使用应用启动完成后,再举行赋值,此时肯定写入完成了。主启动类实现CommandLineRunner接口,重写run(String... args)方法,在其中界说应用启动完成后,执行后续的一些操纵。
  1. @...(注解省略了)
  2. public class XxxApplication implements CommandLineRunner { #org.springframework.boot.CommandLineRunner
  3.     @Resource
  4.     private Environment environment;
  5.     public static void main(String[] args) {
  6.         SpringApplication.run(XxxApplication.class, args);
  7.     }
  8.     @Override
  9.     public void run(String... args) throws Exception {
  10.         ConfigUtils.init(environment);
  11.     }
  12. }
复制代码
这样,就能保证,动态革新后,使用ConfigUtils获取设置,获取到最新的。
只是为了记录自己的学习历程,且本人程度有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表