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

changming06 2024-09-30 10:39:00 阅读 83

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

<code>@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获取配置,获取到最新的。

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。