前言
配置中心主要提供远程配置管理,以及动态刷新配置不用重启服务的作用。改用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);
}
最后
这样即可方便地动态加载配置内容,对代码的侵入性也低。