SpringBoot 环境变量

前言

控制程序行为的方式很多,通过变量控制是最常见的方式之一,而变量的使用方式也很多,以 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 参数有不同的含义:

  1. -D:这是设置系统属性的参数。例如,-Dfile.encoding=UTF-8 设置文件编码为 UTF-8。然后可以在程序中通过 System.getProperty("file.encoding") 来获取这个属性。
  2. -X:主要用于控制 JVM 的运行环境,例如内存大小、垃圾回收等。例如,-Xms64m 设置 JVM 的初始堆内存为 64MB,-Xmx256m 设置 JVM 的最大堆内存为 256MB。

简言之,-D主要是用来设置系统属性,而-X主要是用来设置JVM的运行环境。

Environment variables

操作系统环境变量,在实际场景中,我们可以用它来指定数据文件路径、服务启动端口号、激活文件等,如:

总的来说,该变量是操作系统中用来指定运行环境的一些参数,主要作用:

  1. 配置信息:环境变量常常用于存储系统配置信息,如数据库连接字符串、文件路径等。这样,应用程序可以在运行时读取这些信息,而无需在代码中硬编码。
  2. 影响程序行为:某些环境变量可以改变程序的行为。例如,JAVA_HOME 环境变量指定了 Java 安装的位置,PATH 环境变量指定了系统查找可执行文件的目录。
  3. 区分环境:在不同的运行环境(dev、test、prod)中,可以选择激活不同的环境文件
  4. 安全:环境变量常用于存储敏感信息,如密码、密钥等。这样,这些信息就不会出现在代码或配置文件中,可以提高安全性。

在 Java 中,可以通过 System.getenv() 方法来获取环境变量。

Program arguments

设置应用程序的命令行参数,这些参数会被传递给你的应用程序的 main 方法。

在 idea 设置方式:

也可以在 java 启动时指定,如:

css 复制代码
java Main arg1 arg2 arg3

生效顺序

笔者在实战中常用的方式有:yml/properties、JVM 参数、Environment,三者的常见用途是:

  1. yml/properties文件:主要用于业务参数变量配置,分为 bootstrap.yml、application.yml、application-{环境}.yml
  2. JVM 参数:本地启动时指定 yml/properties 文件路径、服务名称(服务启动后后会注册到测试环境的注册中心,所以要重新命名)、以及 kafka消费组等参数
  3. Environment:指定服务启动端口、profile 文件激活等。

既然有这样的方式定义参数,就有可能重复定义,那 Spring 在加载的时候生效的顺序是?

  1. 命令行参数:在Java中,当启动一个程序时,可以在命令行中指定参数,这些参数会被传递给程序的 main 方法,如:java Main arg1 arg2 arg3
  2. Java 系统属性(System.getProperties()),以-D开头,如 java -DmyKey=myValue MyProgram,启动名为 "MyProgram" 的java程序,并设置一个名为 "myKey" 的系统属性
  3. 操作系统环境变量,通过 IDEA 中 Environment Variables设置。
  4. 配置文件:application-{profile}.properties 或 application.yml
  5. 配置文件:application.properties 或 application.yml
  6. 配置文件:bootstrap.yml

以上便是常见的 SpringBoot 变量设置方式,如果你还有其他方式,欢迎补充!

相关推荐
Victor3564 分钟前
Hibernate(20)Hibernate如何处理继承关系?
后端
Victor3565 分钟前
Hibernate(19)什么是Hibernate的急加载?
后端
chenyuhao20242 小时前
Linux网络编程:传输层协议UDP
linux·服务器·网络·后端·udp
嘟嘟MD9 小时前
程序员副业 | 2025年12月复盘
后端·创业
利刃大大10 小时前
【SpringBoot】Spring事务 && @Transactional详解 && Spring事务失效问题
spring boot·spring·事务
..过云雨11 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
南山乐只11 小时前
【Spring AI 开发指南】ChatClient 基础、原理与实战案例
人工智能·后端·spring ai
㳺三才人子12 小时前
初探 Spring Framework OncePerRequestFilter
spring boot·spring·junit
这是程序猿12 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
努力的小雨12 小时前
从“Agent 元年”到 AI IDE 元年——2025 我与 Vibe Coding 的那些事儿
后端·程序员