SpringMvc問題記錄-Controller對於靜態變數的訪問分析

  • 2019 年 10 月 9 日
  • 筆記

問題描述

在於朋友的討論中分析到一種場景,即:Controller對於一個類中的靜態變數進行訪問時,如果第一個介面修改該靜態變數的數據,另外一個介面獲取該靜態變數的數據,那麼返回的結果是什麼?

操作步驟是,先進行修改介面的訪問,然後再進行獲取介面的訪問。

實際驗證

創建一個SpringBoot項目,項目結構如下:

在這裡插入圖片描述## 創建Controller介面

package com.taowd.controller;  import com.taowd.util.Constants;  import org.springframework.web.bind.annotation.PostMapping;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RestController;    /**   * @author Taoweidong   */  @RestController  @RequestMapping("/")  public class HelloWorld {        /**       * @return       */      @PostMapping("/set")      public String set() {          //修改操作          Constants.HELLO_WORLD = "修改之後的數據";          return "已修改";      }      /**       * @return       */      @PostMapping("/get")      public String get() {          //獲取操作          return Constants.HELLO_WORLD;      }  }  

創建靜態變數類

package com.taowd.util;  /**   * @author Taoweidong   */  public class Constants {      /**       * 靜態常量.       */      public static String HELLO_WORLD = "Hello World";  }  

測試過程

測試使用postman工具進行介面測試

第一次訪問get介面查看原數據

http://127.0.0.1:8080/get
在這裡插入圖片描述

第二次訪問set介面重新設置靜態變數值

在這裡插入圖片描述

第三次訪問get介面查看靜態變數的值

在這裡插入圖片描述

結果分析

static變數

參考:https://www.cnblogs.com/dolphin0520/p/3799052.html

static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的對象所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

static成員變數的初始化順序按照定義的順序進行初始化。

在Constants類中的HELLO_WORLD變數即被static修飾符修飾,屬於靜態變數,在記憶體中只有一個副本,當類初次載入時被初始化,後面系統的使用,都是修改查詢這一個副本,因此修改介面被觸發後HELLO_WORLD變數就被修改,然後調用get查詢介面查詢時,獲取的就是修改後的數據。

參考

https://www.cnblogs.com/dolphin0520/p/3799052.html
https://www.cnblogs.com/zxf330301/articles/6105127.html
https://www.cnblogs.com/wenhuang/p/9784419.html

歡迎訪問個人部落格: http://www.taoweidong.com/