之前在公司做业务开发的时候有个需求,需要给工具类中静态变量赋值为application.yml
中记录的常量,稍微花了点功夫,也踩了点坑,所以在此做个记录。
配置文件
配置文件中的常量如下:
internal:
aes:
key: ${AES_KEY:testkey}
iv: ${AES_IV:testiv}
@Value()注解
一般情况下,我们使用@Value()
注解即可给变量赋值成我们指定key的值,例如:
@Value("${internal.aes.key}")
private String key;
@Value("${internal.aes.iv}")
private String iv;
但是,SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值。所以@Value()
就不适用于这种情况。
使用Environment赋值
网上有不少文章给出的方案都是选择给变量增加一个set方法,然后将@Value()
注解置于set方法之上,例如:
private static String key;
private static String iv;
@Value("${internal.aes.key}")
public void setKey(String key){
key = key;
}
@Value("${internal.aes.iv}")
public void setIv(String iv){
iv = iv;
}
我选择的方案是使用Environment给变量赋值,两种方案都能实现需求,大家可以自行选择哈。话不多说直接上代码:
@Component //需要将工具类作为spring bean
public class AESUtil implements CommandLineRunner, EnvironmentAware { //需要实现这两个接口
private Environment environment;
public static String S_KEY;
public static String IV_PARAMETER;
@Override
public void run(String... args) throws Exception {
//这里给静态变量赋值
AESUtil.S_KEY = environment.getProperty("internal.aes.key");
AESUtil.IV_PARAMETER = environment.getProperty("internal.aes.iv");
}
@Override
public void setEnvironment(Environment env) {
this.environment = env;
}
}
这样我们就把值赋给静态变量了!!
文章中出现任何不对的地方,望大家批评指正~~