簡單分析@Value是否賦值給靜態變數
阿新 • • 發佈:2021-01-09
技術標籤:小小小知識點value靜態變數靜態變數注入spring靜態變數
經常使用@Value複製給成員變數,但是靜態變數能複製嗎?答案是否定的,不能夠生效。
編寫一個例項如下:
@RestController
@RequestMapping("/health")
public class HelloController {
@Value("${env}")
private String env;
@Value("${env2}")
private static String env2 = "static" ;
@RequestMapping("/check")
public String check() {
String s = env + " " + env2;
System.out.println(s);
return s;
}
}
在yaml檔案中配置
env : qsm
env2 : qsm2
接下來啟動程式,並訪問http://localhost:8080/health/check
發現列印的為qsm static
代表對靜態變數賦值沒有生效。
那麼具體原因呢?
類載入過程中,使用類載入器載入java位元組碼到jvm中,對於靜態變數會有準備和初始化2個地方有處理,前置是賦值初始值,後者賦值我們自己定義的值。所以這個時候,靜態變數從屬於類的。
那麼就沒有辦法賦值了嗎?還是有辦法的,即使用setter方法上注入,setter方法去掉static
@Value("${env2}")
public void setEnv2(String env2) {
HelloController.env2 = env2;
}
/*
public static void setEnv2(String env2) {
HelloController.env2 = env2;
}
*/
這個時候,再次訪問地址,就可以得到qsm qsm2
。此時就代表賦值成功了。
【完,喜歡就點個讚唄】
正在去往BAT的路上修行