工作中遇到的场景:
采用的微服务框架,之前es和hbase 的空间名和表名等配置写在JAVA Conatant类中,为了调试方便要改放到config服务下。各属性都是 static final,所以面临@Value静态注入问题。
操作步骤
- 创建一个类,+注解component,被spring托管
- 声明静态属性和get,set方法。注意set方法不是satic,get方法和属性有static关键字。
- 在set方法加入@Value()注解
例子就是下面段代码:
@Component
public class DBNameConfig {
private static String ES_DB_NAME;
private static String HB_DB_NAMESPACE;
public static String getES_DB_NAME() {
return ES_DB_NAME;
}
@Value("${ES_DB_NAME}")
public void setES_DB_NAME(String eS_DB_NAME) {
ES_DB_NAME = eS_DB_NAME;
}
public static String getHB_DB_NAMESPACE() {
return HB_DB_NAMESPACE;
}
@Value("${HB_DB_NAMESPACE}")
public void setHB_DB_NAMESPACE(String hB_DB_NAMESPACE) {
HB_DB_NAMESPACE = hB_DB_NAMESPACE;
}
}
调用的代码
@Component
public class Constant{
@Autowired
DBNameConfig dBNameConfig;
... #省略部分代码
public static final String ES_DB_NAME = DBNameConfig.getES_DB_NAME();
public static final String HB_DB_NAMESPACE = DBNameConfig.getHB_DB_NAMESPACE();
...
}
这样就不用改其他代码,配置移到Config服务下,程序也能正常运行。
还没想清楚的问题:读书的时候记得java的加载顺序是先静态,这里的属性还加了final。难道加载顺序是先spring 后static ,感觉不合理…