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 变量设置方式,如果你还有其他方式,欢迎补充!

相关推荐
画个大饼43 分钟前
Go语言实战:快速搭建完整的用户认证系统
开发语言·后端·golang
李白的粉5 小时前
基于springboot的在线教育系统
java·spring boot·毕业设计·课程设计·在线教育系统·源代码
小马爱打代码6 小时前
SpringBoot原生实现分布式MapReduce计算
spring boot·分布式·mapreduce
iuyou️6 小时前
Spring Boot知识点详解
java·spring boot·后端
一弓虽6 小时前
SpringBoot 学习
java·spring boot·后端·学习
姑苏洛言6 小时前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy7 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
方圆想当图灵7 小时前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航7 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
我的golang之路果然有问题8 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database