springboot读取配置时,读取到了系统环境变量

在Spring Boot应用中,读取配置通常通过application.propertiesapplication.yml文件进行。不过,Spring Boot也支持从系统环境变量读取配置,这使得应用可以在不同的环境中灵活配置。下面详细介绍如何在Spring Boot中读取系统环境变量。

1. 配置优先级

Spring Boot有一套配置优先级机制,从多个来源读取配置,优先级从高到低依次是:

  1. 命令行参数
  2. SPRING_APPLICATION_JSON中的属性(系统环境变量或命令行参数)
  3. Java系统属性(System.getProperties()
  4. 操作系统环境变量
  5. application.propertiesapplication.yml文件(位于src/main/resources
  6. 通过@PropertySource注解声明的属性源
  7. 默认属性

2. 读取系统环境变量

在Spring Boot应用中,可以通过以下几种方式读取系统环境变量:

方法一:使用@Value注解

可以直接在Spring组件中使用@Value注解来注入系统环境变量:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Value("${MY_ENV_VARIABLE}")
    private String myEnvVariable;

    public void printEnvVariable() {
        System.out.println("MY_ENV_VARIABLE: " + myEnvVariable);
    }
}

假设环境变量MY_ENV_VARIABLE的值是HelloWorld,那么myEnvVariable字段就会被注入HelloWorld

方法二:使用@ConfigurationProperties注解

可以创建一个配置类来绑定多个环境变量:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "my.config")
public class MyConfig {

    private String envVariable;

    public String getEnvVariable() {
        return envVariable;
    }

    public void setEnvVariable(String envVariable) {
        this.envVariable = envVariable;
    }
}

假设有环境变量MY_CONFIG_ENV_VARIABLE,那么在application.properties中添加以下内容:

my.config.env-variable=${MY_CONFIG_ENV_VARIABLE}

然后可以在应用中使用MyConfig类来获取环境变量的值。

方法三:使用Environment对象

可以直接使用Spring的Environment对象来访问环境变量:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Autowired
    private Environment env;

    public void printEnvVariable() {
        String myEnvVariable = env.getProperty("MY_ENV_VARIABLE");
        System.out.println("MY_ENV_VARIABLE: " + myEnvVariable);
    }
}
方法四:命令行参数覆盖

可以在启动Spring Boot应用时通过命令行参数覆盖环境变量:

java -jar myapp.jar --MY_ENV_VARIABLE=HelloWorld

这种方式会覆盖环境变量,并且具有更高的优先级。

3. 示例

假设有一个Spring Boot项目,在读取环境变量时可以按照上述任一方式进行配置。以下是一个完整示例:

配置类
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class MyComponent {

    @Value("${MY_ENV_VARIABLE}")
    private String myEnvVariable;

    private final Environment env;

    public MyComponent(Environment env) {
        this.env = env;
    }

    @PostConstruct
    public void printEnvVariables() {
        // 使用 @Value 注解读取
        System.out.println("MY_ENV_VARIABLE (via @Value): " + myEnvVariable);
        
        // 使用 Environment 对象读取
        String myEnvVariableViaEnv = env.getProperty("MY_ENV_VARIABLE");
        System.out.println("MY_ENV_VARIABLE (via Environment): " + myEnvVariableViaEnv);
    }
}
启动类
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

4. 运行应用

确保在操作系统中设置了环境变量MY_ENV_VARIABLE,然后运行Spring Boot应用:

export MY_ENV_VARIABLE=HelloWorld
java -jar myapp.jar

应用启动后,会输出环境变量的值。

通过这些方法,可以灵活地在Spring Boot应用中读取和使用系统环境变量,使应用配置更加灵活和环境无关。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值