做了這些年開發,今天第一次梳理了這三種常用的變數

北漂程式設計師發表於2022-06-04

  在前邊分享自定義springboot的配置檔案的時候,提到了JVM變數和系統環境變數的配置,今天想對這塊的內容做個梳理,

  1、什麼是JVM變數、系統環境變數、程式變數;

  2、怎麼使用這些變數;

  3、這些變數如何起作用的;

一、認識這些這些變數

1.1、JVM變數

所謂的JVM變數和平時見到的不太一樣,比如-Xmx1024m這樣的,這裡說的JVM變數更確切的說是java命令中的一個選項,如,檢視java命令的幫助,

我們前邊在idea中進行配置的時候,使用的也是“-D”這個選項,在服務啟動的時候會設定一個key-value的屬性。並且從上面的註釋也可以看到對“-D”的解釋是“設定系統屬性”,當然設定了系統屬性就要獲取系統屬性,後面會說到如何獲取系統屬性。類似“-D”這樣的選項還有這些常見的:java -classpath、java -version,還有下面的java -javaagent:

1.2、系統環境變數

所謂系統環境變數,更多的理解為某個服務的全域性的環境變數,供這個服務中的所有元件來使用,

 

1.3、程式變數

所謂程式變數指的是main方法中的引數,我們經常寫的main方法如下,

@SpringBootApplication
public class BootServer {
    public static void main(String[] args) {
        SpringApplication.run(BootServer.class);
    }
}

我們知道main方法是有返回值的,而且返回值是固定的,是字串陣列,只不過在平時我們執行main方法的時候很少會傳參。這裡說的程式變數就是說在springboot啟動的時候給啟動類中的main方法傳值。對映到idea中如下,

在上面的“Program arguments”中便可以配置程式變數,在執行的時候傳入main方法的引數中,可以在main方法中使用。

二、怎麼使用這些變數

  上面說到什麼是JVM變數、環境變數、程式變數,下面需要看下如何使用這些變數。

2.1、JVM變數

其實在前面的文章中已經使用了JVM變數,對應到idea中就是在下面的位置進行配置即可,今天先不重複之前的配置,順便配置一個,需要注意一點這裡的配置除了JVM已經定義好的,其他的自定義配置請使用前面說到的“-D”的形式,多個配置使用空格隔開

上面配置好了,要怎麼使用那,簡單起見我這裡就在BootServer中使用了,其實這裡的配置可以在任何一個類中使用,看下下面的用法就明白了,

@SpringBootApplication
public class BootServer {
    public static void main(String[] args) {
        //獲取vm引數
        String value=System.getProperty("customer.value");
        String key=System.getProperty("customer.key");
        System.out.println("value:"+value+",key:"+key);

        SpringApplication.run(BootServer.class);
    }
}

啟動時的日誌如下,

可以看到列印出來了配置的值。獲取JVM變數的方式很簡單,就是使用“System.getProperty()”方法即可,所以我說在每個類中都可以獲取,也就是說這個引數對整個服務都是起作用的

 在idea啟動的時候第一行都會列印下面的一句話,不知道大家注意過沒用,而且還有三個點,你點開過沒有,

沒用點開的小夥伴,你肯定錯過了一個億,今天我們點開看下,

其實這裡執行的就是“java -jar ”這樣的命令,只不過加了引數,而且可以看到加了“-D”,我們加的JVM變數就是以這樣的形式傳到程式裡的。

2.2、環境變數

環境變數的配置,在idea中是下面這樣的配置,

那麼在程式中是怎麼獲取這裡的配置吶,

@SpringBootApplication
public class BootServer {
    public static void main(String[] args) {
        //獲取vm引數
        String value=System.getProperty("customer.value");
        String key=System.getProperty("customer.key");
        System.out.println("value:"+value+",key:"+key);
        //獲取環境變數
        String templateValue=System.getenv("template");
        System.out.println("環境變數:"+templateValue);

        SpringApplication.run(BootServer.class);
    }
}

使用方式也很簡單,使用“System.getenv()”方法即可,而且在程式的每個類中都可以使用,

2.3、程式變數

 好了,最後來看下程式變數是如何使用的,其配置方式也很簡單,

在idea中“Program arguments”中配置程式變數,多個值使用“空格”分隔即可,在程式中獲取配置的程式變數也很簡單,這裡需要注意這個變數只能在含有main方法的類中使用。

@SpringBootApplication
public class BootServer {
    public static void main(String[] args) {
        //獲取vm引數
        String value=System.getProperty("customer.value");
        String key=System.getProperty("customer.key");
        System.out.println("value:"+value+",key:"+key);
        //獲取環境變數
        String templateValue=System.getenv("template");
        System.out.println("環境變數:"+templateValue);
        //獲取程式變數
        System.out.println(args[0]+","+args[1]+","+args[2]);

        SpringApplication.run(BootServer.class);
    }
}

列印結果如下,

列印出了配置的“1 2 3”.

前邊提到在程式開始時會有一長串的命令,我們點開來看,能找到程式變數的影子,

其實就是在"java -jar xxx.jar xxx.xxx.xx 引數",這裡的引數就是程式變數。

三、總結

  主要分析了,平時開發使用比較多的幾種變數及用法,

  1、JVM引數、程式變數、環境變數;

  2、JVM引數通過“-D”來配置;程式變數在啟動類後跟帶“空格”的引數值;

  3、JVM引數、環境變數在每個類中都可以獲取到,而程式變數僅在啟動類的main函式中;

  4、JVM引數、環境變數分別通過System.getProperty()、System.getenv()方法獲取;

 

推薦閱讀

springboot如何使用自定義配置檔案

springboot竟然有5種預設的載入路徑,你未必都知道

5分鐘快速搭建一個springboot的專案

相關文章