java 在SpringBoot中读取环境变量

tvz2xvvm  于 2023-05-27  发布在  Java
关注(0)|答案(8)|浏览(285)

SpringBoot中读取环境变量的最佳方式是什么?
在Java中,我使用:

String foo = System.getenv("bar");

是否可以使用@Value注解来实现?

zphenhs4

zphenhs41#

报价the documentation
Sping Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML文件、环境变量和命令行参数来外部化配置。可以使用@Value annotation**直接将属性值注入到bean中,通过Spring的Environment抽象访问或通过@ConfigurationProperties绑定到结构化对象。
因此,由于Sping Boot 允许您使用环境变量进行配置,并且由于Spring boot还允许您使用@Value从配置中读取属性,因此答案是肯定的。
例如,下面将给予相同的结果:

@Component
public class TestRunner implements CommandLineRunner {
    @Value("${bar}")
    private String bar;
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public void run(String... strings) throws Exception {
        logger.info("Foo from @Value: {}", bar);
        logger.info("Foo from System.getenv(): {}", System.getenv("bar")); // Same output as line above
    }
}
b4lqfgs4

b4lqfgs42#

您可以使用@Value注解来实现:

@Value("${bar}")
private String myVariable;

如果找不到,也可以使用冒号给予默认值:

@Value("${bar:default_value}")
private String myVariable;
tpgth1q7

tpgth1q73#

以下是三种用于访问名为MY_SECRET的系统环境变量的“占位符”语法:

@Value("${MY_SECRET:aDefaultValue}")
private String s1;

@Value("#{environment.MY_SECRET}")
private String s2;

@Value("${myApp.mySecretIndirect:aDefaultValue}") // via application property
private String s3;

在第三种情况下,占位符引用属性文件中已从系统环境初始化的应用程序属性:

myApp.mySecretIndirect=${MY_SECRET:aDefaultValue}

要使@Value工作,它必须在活动的@Component(或类似)中使用。如果您想在单元测试期间使用它,还有额外的gochas--请参阅我对Why is my Spring @Autowired field null?的回答

iqih9akk

iqih9akk4#

或者,您可以使用org.springframework.core.env.Environment接口访问环境变量:

import org.springframework.core.env.Environment;

@Autowired
private Environment env;

//...

System.out.println(env.getProperty("bar"));

Read more...

ldioqlga

ldioqlga5#

你可以的但是,大多数答案都没有提到,排序很重要,请检查此https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/boot-features-external-config.html
您的OS environment variables将覆盖来自Application properties packaged inside your jar (application.properties and YAML variants).的值,因此基本上,您的环境变量具有更高的优先级。

9udxz4iz

9udxz4iz6#

您可以将环境变量放在application.yml/application.properties文件中,然后使用@Value注解获取值。但是为了使用@Value注解,你的类应该是一个bean,并且应该用@Component注解。也可以为变量提供默认值。

@Component
@NoArgsConstructor
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class MyClass {
 
@Value("${something.variable:<default-value>}")
private String myEnvVariable;

}
mnowg1ta

mnowg1ta7#

您可以将它与@Component s和@service类的@Value注解一起使用。
如果是普通类的话,有时候是不行的。
示例:

@Component
public class Testclass{
    @Value("${MY_SECRET:aDefaultValue}")
    private String test1;

    @Value("#{environment.MY_SECRET}")
    private String test2;

    @Value("${myApp.mySecretIndirect:aDefaultValue}")
    private String test3;

    //to get the properties list which are in "," separated
    @Value("${my.list.of.strings}")
    private List<String> myList;
}
kxxlusnw

kxxlusnw8#

首先要在properties配置文件中定义相关字段信息,然后使用@ value获取并使用example:

@Value("${abc}")
private String abc;

相关问题