需求:
已有运行好的项目,系统文件根目录是写死的,现想最简洁的修改,减少对其他以根目录拼接的路径的影响。
原配置文件路径处理类:
package com.xdja.pki.ra.core.constant;
/**
* 配置文件常量
*
* @author
*/
public class PathConstants {
/**
* 系统配置根目录
*/
public static String GLOBAL_CONF_ROOT = "/home/xdja/conf/ra/";
/**
* 系统全局配置文件
*/
public static String GLOBAL_CONF_FILE_PATH = GLOBAL_CONF_ROOT + "config.json";
/**
* 批量注册模板文件
*/
public static String BATCH_REGISTER_FILE_PATH = GLOBAL_CONF_ROOT + "RATemplate/";
/**
* 批量注册错误信息文件
*/
public static String BATCH_REGISTER_ERROR_FILE_PATH = GLOBAL_CONF_ROOT + "RATemplate/error/";
/**
* CA证书文件路径
*/
public static String CA_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "caCert.cer";
/**
* 所有CA证书文件夹路径
*/
public static String CA_SERVICE_CERTS_FILE_PATH = GLOBAL_CONF_ROOT + "caCerts";
/**
* RA证书文件路径
*/
public static String RA_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "raServiceCert.cer";
/**
* CA证书信任证书链文件路径
*/
public static String CA_TRUST_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "trustCert.p7b";
}
现将根目录写到配置文件config.properties中:
1. 通常通过@Value注解可以直接得到配置文件的值,比如
@Value("${ra.tomcat.path}")
private String tomcatPath;
实践得知上述方法给静态变量赋值只能拿到null
2. 通过非静态set方法将配置文件赋值给静态变量
@Component
public class PathConstants {
/**
* 系统配置根目录
*/
public static String GLOBAL_CONF_ROOT;
@Value("${conf.path}")
public void setConfPath(String confPath) {
GLOBAL_CONF_ROOT = confPath;
}
}
注意要有注解@Component
3. 原其他路径都为静态变量,在加载时,优先运行,运行结束后才运行非静态set方法,无法拿到预期值,比如:
@Component
public class PathConstants {
/**
* 系统配置根目录
*/
public static String GLOBAL_CONF_ROOT;
@Value("${conf.path}")
public void setConfPath(String confPath) {
GLOBAL_CONF_ROOT = confPath;
}
public static String GLOBAL_CONF_FILE_PATH = GLOBAL_CONF_ROOT + "config.json";
}
通过类调用 PathConstants.GLOBAL_CONF_FILE_PATH,运行结果:
4. 开辟新道路,通过在set方法里拼接赋值,达到预期效果。
优化后整体代码:
package com.xdja.pki.ra.core.constant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 配置文件常量
*
* @author
*/
@Component
public class PathConstants {
/**
* 系统配置根目录
*/
public static String GLOBAL_CONF_ROOT;
@Value("${conf.path}")
public void setConfPath(String confPath) {
GLOBAL_CONF_ROOT = confPath;
GLOBAL_CONF_FILE_PATH = GLOBAL_CONF_ROOT + "config.json";
BATCH_REGISTER_FILE_PATH = GLOBAL_CONF_ROOT + "RATemplate/";
BATCH_REGISTER_ERROR_FILE_PATH = GLOBAL_CONF_ROOT + "RATemplate/error/";
CA_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "caCert.cer";
CA_SERVICE_CERTS_FILE_PATH = GLOBAL_CONF_ROOT + "caCerts";
RA_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "raServiceCert.cer";
CA_TRUST_SERVICE_CERT_FILE_PATH = GLOBAL_CONF_ROOT + "trustCert.p7b";
}
/**
* 系统全局配置文件
*/
public static String GLOBAL_CONF_FILE_PATH;
/**
* 批量注册模板文件
*/
public static String BATCH_REGISTER_FILE_PATH;
/**
* 批量注册错误信息文件
*/
public static String BATCH_REGISTER_ERROR_FILE_PATH;
/**
* CA证书文件路径
*/
public static String CA_SERVICE_CERT_FILE_PATH;
/**
* 所有CA证书文件夹路径
*/
public static String CA_SERVICE_CERTS_FILE_PATH;
/**
* RA证书文件路径
*/
public static String RA_SERVICE_CERT_FILE_PATH;
/**
* CA证书信任证书链文件路径
*/
public static String CA_TRUST_SERVICE_CERT_FILE_PATH;
}
OK!本来我师傅都放弃这个需求了,就这么弄好啦!