首页 > 其他分享 >01.SpringBoot开发杂记-使用工具类,静态读取配置文件中的配置的写法

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

时间:2024-09-27 15:11:42浏览次数:1  
标签:ConfigUtils 01 SpringBoot 配置文件 配置 private public String

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

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

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

标签:ConfigUtils,01,SpringBoot,配置文件,配置,private,public,String
From: https://www.cnblogs.com/changming06/p/18435779

相关文章

  • REF3012, REF3020, REF3025, REF3030, REF3033, REF3040采用 SOT-23-3 封装的 REF30xx
    1特性•微型封装:SOT-23-3•低压降:1mV•大输出电流:25mA•高精度:0.2%•低IQ:42µA(典型值)•出色的额定温漂性能:–0°C至70°C范围内为50ppm/°C(最大值)––40°C至+125°C范围内为75ppm/°C(最大值)2应用•温度和压力发送器•便携式、电池供电类设备......
  • springFactoriesLoader作用是读取配置文件
    `SpringFactoriesLoader`是Spring框架中的一个类,用于从`META-INF/spring.factories`文件中加载配置。这是一个非常强大的机制,使得Spring能够通过查找类路径上的配置文件,动态地发现和加载特定的组件或服务。在Spring自动注入(自动配置)中,`SpringFactoriesLoader`起到了以......
  • 【Java】【SpringBoot】SpringBoot整合MybatisPlus(快速入门)
    较早之前,写了SpringBoot整合Mybatis:https://www.cnblogs.com/luyj00436/p/16701894.html。这个数据库的链接有过时。Mybatisplus是mybatis的增强工具。对比Mybatis功能强大、易于使用。对于复杂业务,需要连接多张表单,Mybatisplus不够灵活,隐藏了代码,也不能更好地调试;对于简单业务......
  • springboot在线教学平台
    基于springboot+vue实现的在线教学平台 (源码+L文+ppt)4-069 4.1系统结构设计  这些功能可以充分满足在线教学平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。        图4-1功能结构图         4.2系统功能模块设计......
  • (12-3-01)基于全向驱动的机器人及其控制系统:机器人运动控制和状态管理(1)
    4.3 机器人运动控制和状态管理在本项目的“task6_ws”目录中包含了实现一个综合的机器人控制系统的程序文件,负责机器人的运动控制、状态管理和位置估计。包括控制机器人的移动和反馈信息的管理,使用标记识别技术来定位和调整机器人位置。4.3.1 启动文件文件task6_contro......
  • springboot在线教学平台
     基于springboot+vue实现的在线教学平台 (源码+L文+ppt)4-069 4.1系统结构设计  这些功能可以充分满足在线教学平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。        图4-1功能结构图         4.2系统功能模块设......
  • springboot在线教学平台
     基于springboot+vue实现的在线教学平台 (源码+L文+ppt)4-069 4.1系统结构设计  这些功能可以充分满足在线教学平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。        图4-1功能结构图         4.2系统功能模块设......
  • 基于SpringBoot 应用Stream流+递归 实现多级分类
    SpringBoot->Stream流实现步骤:先查询所有级联的数据,然后通过Java8 Stream 流来比较和判断,最终生成有顺序的级联数据实体类:@DatapublicclassAddr{/***主键id*/privateLongaddrId;/***名称*/privateStringaddrNam......
  • springboot在线教学平台
     基于springboot+vue实现的在线教学平台 (源码+L文+ppt)4-069 4.1系统结构设计  这些功能可以充分满足在线教学平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。        图4-1功能结构图         4.2系统功能模块设......
  • [微信小程序原创项目]基于Springboot+Vue+Uniapp的通用商城小程序、商城管理系统
    项目提供:完整源码+数据库sql文件+数据库表Excel文件关注我的B站:程序员阿水呀,带小白学习更多干货教程!1、项目功能描述本项目为双角色,用户和管理员,用户使用小程序前台,管理员使用web后台。1.1注册注册功能:填写用户名、密码进行注册。仅开放小程序端即用户端进行注册。......