8

做了这些年开发,今天第一次梳理了这三种常用的变量 - 北漂程序员

 2 years ago
source link: https://www.cnblogs.com/teach/p/16324213.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

  在前边分享自定义springboot的配置文件的时候,提到了JVM变量和系统环境变量的配置,今天想对这块的内容做个梳理,

  1、什么是JVM变量、系统环境变量、程序变量;

  2、怎么使用这些变量;

  3、这些变量如何起作用的;

一、认识这些这些变量

1.1、JVM变量

所谓的JVM变量和平时见到的不太一样,比如-Xmx1024m这样的,这里说的JVM变量更确切的说是java命令中的一个选项,如,查看java命令的帮助,

985599-20220601092306500-1582578703.png

我们前边在idea中进行配置的时候,使用的也是“-D”这个选项,在服务启动的时候会设置一个key-value的属性。并且从上面的注释也可以看到对“-D”的解释是“设置系统属性”,当然设置了系统属性就要获取系统属性,后面会说到如何获取系统属性。类似“-D”这样的选项还有这些常见的:java -classpath、java -version,还有下面的java -javaagent:

985599-20220601093510609-1974705804.png

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中如下,

985599-20220603214745218-646416306.png

在上面的“Program arguments”中便可以配置程序变量,在执行的时候传入main方法的参数中,可以在main方法中使用。

二、怎么使用这些变量

  上面说到什么是JVM变量、环境变量、程序变量,下面需要看下如何使用这些变量。

2.1、JVM变量

其实在前面的文章中已经使用了JVM变量,对应到idea中就是在下面的位置进行配置即可,今天先不重复之前的配置,顺便配置一个,需要注意一点这里的配置除了JVM已经定义好的,其他的自定义配置请使用前面说到的“-D”的形式,多个配置使用空格隔开

985599-20220603215812287-343373024.png

上面配置好了,要怎么使用那,简单起见我这里就在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);
    }
}

启动时的日志如下,

985599-20220603220302151-2031079027.png

可以看到打印出来了配置的值。获取JVM变量的方式很简单,就是使用“System.getProperty()”方法即可,所以我说在每个类中都可以获取,也就是说这个参数对整个服务都是起作用的

 在idea启动的时候第一行都会打印下面的一句话,不知道大家注意过没用,而且还有三个点,你点开过没有,

985599-20220603220804780-365879403.png

没用点开的小伙伴,你肯定错过了一个亿,今天我们点开看下,

985599-20220603220908403-1568400535.png

其实这里执行的就是“java -jar ”这样的命令,只不过加了参数,而且可以看到加了“-D”,我们加的JVM变量就是以这样的形式传到程序里的。

2.2、环境变量

环境变量的配置,在idea中是下面这样的配置,

985599-20220603221304881-1044123877.png

那么在程序中是怎么获取这里的配置呐,

@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()”方法即可,而且在程序的每个类中都可以使用,

985599-20220603221709936-1824499543.png

2.3、程序变量

 好了,最后来看下程序变量是如何使用的,其配置方式也很简单,

985599-20220604164130929-1799744587.png

在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);
    }
}

打印结果如下,

985599-20220604164839098-616789579.png

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

前边提到在程序开始时会有一长串的命令,我们点开来看,能找到程序变量的影子,

985599-20220604165037545-929517140.png

其实就是在"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的项目


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK