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

2022-06-04 18:00:22

  在前邊分享自定義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的專案