1. 解决静态变量@value取不到值
1. 平时用的时候,直接在变量头上加上@Value就能取到对应配置文件中的值
@Value("${ephone.notPushProjectName}")
private String notPushProjectName;
2. 但是当savePath被static修饰了之后,就赋不了值
@Value("${ephone.notPushProjectName}")
private static String notPushProjectName;
这是因为Spring Boot 不支持/不允许把值注入到静态变量中,但是也给出了解决的方案
3. 把@Value("${ephone.notPushProjectName}")
放到静态变量的set方法上面即可,需要注意的是set方法要去掉static,还有就是当前类要交给spring来管理(使用@Component
注解)
@Component // 1.记得加注解
public class PropConstant {
private static String notPushProjectName;
// 2. 使用set方法设置值 记得去掉static
@Value("${ephone.notPushProjectName}")
public void setNotPushProjectName(String notPushProjectName){
SendEPhoneUtil.notPushProjectName = notPushProjectName;
}
}
2. 使用@Value解析List
以使用 .yml
文件为例,我们只需要在配置文件中,跟配置数组一样去配置:
test:
list: aaa,bbb,ccc
在调用时,借助 EL
表达式的 split()
函数进行切分即可。
@Value("#{'${test.list}'.split(',')}")
private List<String> testList;
同样,为它加上默认值,避免不配置这个 key 时候程序报错:
@Value("#{'${test.list:}'.split(',')}")
private List<String> testList;
但是这样有个问题,当不配置该 key 值,默认值会为空串,它的 length = 1(不同于数组,length = 0),这样解析出来 list 的元素个数就不是空了。
这个问题比较严重,因为它会导致代码中的判空逻辑执行错误。这个问题也是可以解决的,在 split()
之前判断下是否为空即可。
@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
private List<String> testList;
如上所示,即为最终的版本,它具有数组方式的全部优点,且更容易在业务代码中去应用。