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/