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/