解决@Value注解静态属性无法注入问题
最近在项目中遇到一个问题:
在给static修饰的变量做@Value注入时,发现变量值为null,发现@Value只能给普通变量做值注入,无法为static属性赋值。
@Data
@Component
public class ApiConfig {
@Value("${openapi.appKey:test21c454457f28a2c31}")
private String appKey;
}
解决方案一:使用 set 方法
抽取出配置类ApiConfig,并添加@Component注解
@Component
public class ApiConfig {
/**
* 设置是否沙箱环境
*/
public static boolean IS_SANDBOX;
/**
* 设置APP_ID
*/
public static String APP_ID;
@Value("${openapi.isSandbox:true}")
public void setIS_SANDBOX(boolean isSandbox) {
IS_SANDBOX = isSandbox;
}
@Value("${openapi.appId:143771897797159}")
public void setAPP_ID(String appId) {
APP_ID = appId;
}
public static boolean isIsSandbox() {
return IS_SANDBOX;
}
public static String getAppId() {
return APP_ID;
}
}
单元测试
@Autowired
ApiConfig apiConfig;
@Test
void testApiConfig(){
System.out.println(eleApiConfig.getAppId());
System.out.println("=================================");
System.out.println(EleApiConfig.getAppId());
}
解决方案二:使用 @PostConstruct 方法
@Component
public class ApiConfig {
/**
* 设置是否沙箱环境
*/
public static boolean IS_SANDBOX;
@Value("${openapi.isSandbox:true}")
public boolean is_sandbox;
/**
* 设置APP_ID
*/
public static String APP_ID;
@Value("${openapi.appId:143771897797159}")
public String appId;
public static boolean isIsSandbox() {
return IS_SANDBOX;
}
public static String getAppId() {
return APP_ID;
}
@PostConstruct
public void init() {
IS_SANDBOX = is_sandbox;
APP_ID = appId;
}
}
参考文章
springboot @value 解决静态属性无法注入问题
SpringBoot使用@Value给静态变量注入值
springboot 使用 @Value 注解给静态变量赋值,实现配置全局化
SpringBoot中静态变量注入方案,一网打尽