Spring Boot使用@Value注解给静态变量赋值,并且拼接静态变量

需求:

已有运行好的项目,系统文件根目录是写死的,现想最简洁的修改,减少对其他以根目录拼接的路径的影响。

 

原配置文件路径处理类:

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中:

Spring Boot使用@Value注解给静态变量赋值,并且拼接静态变量_第1张图片

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!本来我师傅都放弃这个需求了,就这么弄好啦!

你可能感兴趣的:(学习笔记,SpringBoot)