前言
控制程序行为的方式很多,通过变量控制是最常见的方式之一,而变量的使用方式也很多,以 SpringBoot 为例,我们可以通过 yml、JVM 参数、命令行参数、系统参数等多种手段,指定某些特殊变量,使其在程序运行时生效。
看看常见的 IDEA 变量配置:
本文将以 SpringBoot 为例,讲解实战中如何设置环境变量。
变量
yml/properties 配置文件
这种文件在 Spring 应该中最为常见,我们应用程序的主要配置参数都设置在这类文件中。
yml(yaml) 文件 和 properties 文件格式都支持,二者选其一即可,我们以 yml 文件为例:
spring 默认约定使用 application 作为文件名(前缀),即 application.yml,多环境定义格式:application-{环境}.yml,如:
- 开发:application-dev.yml
- 测试:application-test.yml
- 生产:application-prod.yml
我们在启动时,指定激活对应的环境即可,如:
项目实战配置格式:
可以看到,除了对应环境的 yml 配置,还存在 bootstrap.yml 和 application.yml 文件,具体有什么区别?
- bootstrap.yml:主要用于系统启动的时候加载的一些配置信息。比如,使用 Apollo 配置中心的时候,就可以在这个文件中指定 Apollo Server 的地址。
- application.yml:是 Spring Boot 的主配置文件,定义通用属性(提炼抽取变量)
- application-{profile}.yml:特定环境下的配置,可以通过
spring.profiles.active={profile}
进行激活配置。
如果都定义了相同属性怎么选择?
如果你在 bootstrap.yml、application.yml 和 application-{profile}.yml 中定义了相同的属性,那么:
- application-{profile}.yml 中的属性值会覆盖 application.yml 中的属性值,
- application.yml 中的属性值会覆盖 bootstrap.yml 中的属性值。
JVM 参数
通常在启动程序时,指定的特殊值(系统属性),比如指定配置文件地址、应用程序名称等,以 -D
开头:
当然,在服务器环境,运维通常还要指定 jvm 运行参数,以 -X
开头:
- -Xms:设置初始Java堆大小。例如,-Xms64m表示初始堆大小为64MB。
- -Xmx:设置最大Java堆大小。例如,-Xmx256m表示最大堆大小为256MB。
- ...
-D和-X分别表示什么?
在 Java 的 VM options 中,-D
和 -X
参数有不同的含义:
-D
:这是设置系统属性的参数。例如,-Dfile.encoding=UTF-8 设置文件编码为 UTF-8。然后可以在程序中通过 System.getProperty("file.encoding") 来获取这个属性。-X
:主要用于控制 JVM 的运行环境,例如内存大小、垃圾回收等。例如,-Xms64m 设置 JVM 的初始堆内存为 64MB,-Xmx256m 设置 JVM 的最大堆内存为 256MB。
简言之,-D主要是用来设置系统属性,而-X主要是用来设置JVM的运行环境。
Environment variables
操作系统环境变量
,在实际场景中,我们可以用它来指定数据文件路径、服务启动端口号、激活文件等,如:
总的来说,该变量是操作系统中用来指定运行环境的一些参数,主要作用:
- 配置信息:环境变量常常用于存储系统配置信息,如数据库连接字符串、文件路径等。这样,应用程序可以在运行时读取这些信息,而无需在代码中硬编码。
- 影响程序行为:某些环境变量可以改变程序的行为。例如,JAVA_HOME 环境变量指定了 Java 安装的位置,PATH 环境变量指定了系统查找可执行文件的目录。
- 区分环境:在不同的运行环境(dev、test、prod)中,可以选择激活不同的环境文件
- 安全:环境变量常用于存储敏感信息,如密码、密钥等。这样,这些信息就不会出现在代码或配置文件中,可以提高安全性。
在 Java 中,可以通过 System.getenv() 方法来获取环境变量。
Program arguments
设置应用程序的命令行参数
,这些参数会被传递给你的应用程序的 main 方法。
在 idea 设置方式:
也可以在 java 启动时指定,如:
css
java Main arg1 arg2 arg3
生效顺序
笔者在实战中常用的方式有:yml/properties、JVM 参数、Environment,三者的常见用途是:
- yml/properties文件:主要用于业务参数变量配置,分为 bootstrap.yml、application.yml、application-{环境}.yml
- JVM 参数:本地启动时指定 yml/properties 文件路径、服务名称(服务启动后后会注册到测试环境的注册中心,所以要重新命名)、以及 kafka消费组等参数
- Environment:指定服务启动端口、profile 文件激活等。
既然有这样的方式定义参数,就有可能重复定义,那 Spring 在加载的时候生效的顺序是?
- 命令行参数:在Java中,当启动一个程序时,可以在命令行中指定参数,这些参数会被传递给程序的 main 方法,如:
java Main arg1 arg2 arg3
。 - Java 系统属性(System.getProperties()),以
-D
开头,如java -DmyKey=myValue MyProgram
,启动名为 "MyProgram" 的java程序,并设置一个名为 "myKey" 的系统属性 - 操作系统环境变量,通过 IDEA 中
Environment Variables
设置。 - 配置文件:application-{profile}.properties 或 application.yml
- 配置文件:application.properties 或 application.yml
- 配置文件:bootstrap.yml
以上便是常见的 SpringBoot 变量设置方式,如果你还有其他方式,欢迎补充!