千万不要再使用Nacos动态配置注解

4 篇文章 0 订阅
4 篇文章 1 订阅

前言

配置中心主要提供远程配置管理,以及动态刷新配置不用重启服务的作用。改用Nacos作为配置中心,得在参数上加上@RefreshScope注解才能实现配置动态刷新,非常不靠谱。一是改动代码量大,二是有时候还不会生效,在此建议通过org.springframework.core.env.Environment获取配置信息。

改动

■ 旧时获取配置方式

springboot中使用@Value来获取配置值并设置参数,也是相当烦人,要注意各种事项,否则一不留神就是null。在springboot没流行之前,一般是采用工具类读取配置文件存入Map中,再供调用。如果是这种方式,那么就乐开花了,只需改动工具类即可实现动态获取配置。

■ 工具类

直接调用工具类的静态方法就可获取配置值。

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.stereotype.Component;

/**
 * 全局配置类
 * @author bbq
 */
@Component
public class Global implements EnvironmentAware {

    private static Environment environment;

    public static String getConfig(String key) {
        return environment.getProperty(key);
    }

    public static String getConfig(String key, String defaultValue) {
        String value = getConfig(key);
        return value != null ? value : defaultValue;
    }

    public static Integer getConfigInteger(String key) {
        return environment.getProperty(key, Integer.class);
    }

    public static Integer getConfigInteger(String key, Integer defaultValue) {
        Integer value = getConfigInteger(key);
        return value != null ? value : defaultValue;
    }

    @Override
    public void setEnvironment(Environment environment) {
        Global.environment = environment;
    }

    private static Global global = new Global();
    
    public static Global getInstance() {
        return global;
    }
}

■ 调整加载顺序

比如XxlJob的配置类中我采用了这种工具类获取配置值。而spring容器中加载类的顺序本是不可控的,也就是说如果先加载XxlJobConfig进spring中,Global类后加载就会报错,只会当做普通类加载,EnvironmentAware的setEnvironment不会调用,就会报Environment为null。只需在最早调用的spring容器类的上面加上 @DependsOn(“global”) 即可优先加载Global类进spring容器。

@DependsOn("global")
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    private String adminAddresses;

    private String accessToken;

    private String appname;

    private String address;

    private String ip;

    private Integer port;

    private String logPath;

    private Integer logRetentionDays;

    {
        adminAddresses = Global.getConfig("xxl.job.admin.addresses");
        accessToken = Global.getConfig("xxl.job.accessToken");
        appname = Global.getConfig("xxl.job.executor.appname");
        address = Global.getConfig("xxl.job.executor.address");
        ip = Global.getConfig("xxl.job.executor.ip");
        port = Global.getConfigInteger("xxl.job.executor.port");
        logPath = Global.getConfig("xxl.job.executor.logpath");
        logRetentionDays = Global.getConfigInteger("xxl.job.executor.logretentiondays", 7);
    }

最后

这样即可方便地动态加载配置内容,对代码的侵入性也低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值