Spring Boot各类变量的使用

文章目录

  • [1. 变量类型](#1. 变量类型)
  • [2. 获取变量](#2. 获取变量)
    • [2.1 获取方式](#2.1 获取方式)
    • [2.2 获取方法](#2.2 获取方法)
      • [2.2.1 通过@Value注入获取变量值](#2.2.1 通过@Value注入获取变量值)
      • [2.2.2 System.genenv 获取变量值](#2.2.2 System.genenv 获取变量值)
      • [2.2.3 System.getProperty 获取变量值](#2.2.3 System.getProperty 获取变量值)
      • [2.2.4 Environment 获取变量值](#2.2.4 Environment 获取变量值)
      • [2.2.5 @ConfigurationProperties 获取变量值](#2.2.5 @ConfigurationProperties 获取变量值)
      • [2.2.6 SpringApplication.run 程序启动参数中获取变量值](#2.2.6 SpringApplication.run 程序启动参数中获取变量值)

1. 变量类型

  • 操作系统环境变量
  • JVM环境变量
  • 配置文件变量
  • 程序启动参数变量

2. 获取变量

2.1 获取方式

  • @Value 注入获取变量值
  • System.genenv 获取变量值
  • System.getProperty 获取变量值
  • Environment 获取变量值
  • @ConfigurationProperties 获取变量
  • args 程序参数变量

2.2 获取方法

2.2.1 通过@Value注入获取变量值

@Value注入变量用于从SpringBoot项目Environment对象中获取变量值,Environment 对象中的变量来源于配置文件,程序启动参数、JVM环境变量、操作系统环境变量。程序启动参数与配置文件中定义了相同的变量时,程序启动参数将会覆盖配置文件中变量的值。

复制代码
@Value("${gateway.whitelist}")
private String[] whiteList;

从配置文件中获取变量值,如在 application.propertiesbootstrap.yml 等定义好环境变量后,程序中可通过 @Value 注入变量的方式获取变量值。例如在 application.properties 中定义变量:

复制代码
gateway.whitelist=/abc,/def

如果在JVM环境变量、操作系统环境变量、配置文件,程序启动参数中定义了相同的变量名,变量值的优先级是:JVM环境变量 > 程序启动参数 > 操作系统环境变量 > 配置文件参数

2.2.2 System.genenv 获取变量值

System.getenv() 是 Java 内置方法,用于获取操作系统环境变量。

复制代码
String password = System.getProperty("jasypt_encryptor_password");

获取操作系统环境变量,采用这种方式获取 jasypt_encryptor_password 变量的值,一定要将这个变量在操作系统环境变量中定义,如果这个变量在 application.propertiesbootstrap.yml 中定义则将无法被获取。

在操作系统中定义环境变量时,变量名中不能有 . 号,例如 jasypt.encryptor.password 不能设置成操作系统的环境变量。可以使用 _ 来代替 . 号。

2.2.3 System.getProperty 获取变量值

System.getProperty() 是Java 内置方法,用于获取JVM环境变量。

复制代码
String password = System.getProperty("jasypt.encryptor.password");

获取JVM环境中的变量值,需要在JVM环境中定义 jasypt.encryptor.password 。通过 java -jar 启动 spring boot 程序时,可通过使用 -Djasypt.encryptor.password=xxx 的方式设置JVM环境中的变量,示例如下:

复制代码
java -jar -Djasypt.encryptor.password=xxx demo.jar

2.2.4 Environment 获取变量值

从SpringBoot项目Environment对象中获取变量值,Environment 对象中的变量来源于配置文件,程序启动参数、JVM环境变量、操作系统环境变量。程序启动参数与配置文件中定义了相同的变量时,程序启动参数将会覆盖配置文件中变量的值。

复制代码
@Autowired
private Environment environment;

String password = environment.getProperty("jasypt.encryptor.password");

如果操作系统环境变量中定义了 jasypt_encryptor_password 变量,则变量值为操作系统环境变量中的值,如果操作系统环境变量中未定义这个变量,则从配置文件(application.propertiesbootstrap.yml)中获取变量值。假设 bootstrap.yml 中定义了

复制代码
jasypt:
  encryptor:
    password: 123456789

通过 environment.getProperty("jasypt.encryptor.password") 将会获取到变量的值为 123456789。

如果在JVM环境变量、操作系统环境变量、配置文件,程序启动参数中定义了相同的变量名,变量值的优先级是:JVM环境变量 > 程序启动参数 > 操作系统环境变量 > 配置文件参数

2.2.5 @ConfigurationProperties 获取变量值

复制代码
@Configuration
@ConfigurationProperties(prefix = "demo.kv")
@Data
public class AppSecurity {
    private Map<String, String> apps;
}

从配置文件(application.propertiesbootstrap.yml)中获取变量。在 bootstrap.yml 中定义变量:

复制代码
demo:
  kv:
    apps:
      key111: 1230678913234
      key112: 12306789fdfdf4

2.2.6 SpringApplication.run 程序启动参数中获取变量值

复制代码
public static void main(String[] args) {
    SpringApplication.run(BootstrapApplication.class, args);
    for (String arg : args) {
        System.out.println(arg);
    }
}

// output: --demo.name=abc

程序启动参数变量是程序启动时传入的变量. java -jar 启动程序时使用 -- 传入程序启动参数变量。例如在程序启动时,传入 demo.name 的变量:

复制代码
java -jar demo.jar --demo.name=abc

采用这种方式定义变量后,这些参数会被添加到 Environment 环境变量中,如果在配置文件中已经定义了 demo.name 变量,则通过 --demo.name 变量将会覆盖之前在配置文件中定义的变量值。例如:application.properties 中配置信息是:

复制代码
demo.name=hello

程序启动时使用 java -jar demo.jar --demo.name=abc 启动程序,在程序中使用 Environment 对象获取 demo.name 变量时,获取到的值是:abc

相关推荐
一灯架构6 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
Y4090017 小时前
【多线程】线程安全(1)
java·开发语言·jvm
布局呆星7 小时前
SpringBoot 基础入门
java·spring boot·spring
mldong7 小时前
Python开发者狂喜!200+课时FastAPI全栈实战合集,10大模块持续更新中🔥
后端
不懂的浪漫7 小时前
mqtt-plus 架构解析(六):多 Broker 管理,如何让一个应用同时连接多个 MQTT 服务
spring boot·分布式·物联网·mqtt·架构
风吹迎面入袖凉7 小时前
【Redis】Redisson的可重入锁原理
java·redis
w6100104667 小时前
cka-2026-ConfigMap
java·linux·cka·configmap
GreenTea8 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
不懂的浪漫8 小时前
mqtt-plus 架构解析(十):从内部项目到开源框架,mqtt-plus 的抽取过程与决策
spring boot·mqtt·架构·开源