1. 程式人生 > 其它 >簡單分析@Value是否賦值給靜態變數

簡單分析@Value是否賦值給靜態變數

技術標籤:小小小知識點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個地方有處理,前置是賦值初始值,後者賦值我們自己定義的值。所以這個時候,靜態變數從屬於類的。

【重點】:而Spring管理的是【物件】,而不是類。所以Spring是不推薦去賦值給靜態變數的。

那麼就沒有辦法賦值了嗎?還是有辦法的,即使用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的路上修行