在 Spring Boot 中读取环境变量
Posted
技术标签:
【中文标题】在 Spring Boot 中读取环境变量【英文标题】:Read environment variable in SpringBoot 【发布时间】:2017-12-01 20:39:44 【问题描述】:在 SpringBoot 中读取环境变量的最佳方法是什么? 在 Java 中,我使用:
String foo = System.getenv("bar");
使用@Value
注解可以做到吗?
【问题讨论】:
【参考方案1】:引用the documentation:
Spring Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML 文件、环境变量和命令行参数来外部化配置。属性值可以使用
@Value
注释直接注入您的bean,通过Spring 的Environment
抽象访问或通过@ConfigurationProperties
绑定到结构化对象。
所以,既然 Spring 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
【讨论】:
【参考方案2】:你可以用@Value注解来做到这一点:
@Value("$bar")
private String myVariable;
如果没有找到,也可以使用冒号给出默认值:
@Value("$bar:default_value")
private String myVariable;
【讨论】:
【参考方案3】:下面是三个“占位符”语法,可用于访问名为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?的回答
【讨论】:
注意#
和$
在使用environment.
时的不同标点符号。
我认为你有一个错字 @Value("#environment.MY_SECRET") 应该是 $
@dgraf,请参阅之前的评论(由我)——这是故意的。这是一种晦涩难懂的功能,但您可以通过查找 Spring Expression Language (SpEL) 找到它的文档。【参考方案4】:
或者,您可以使用org.springframework.core.env.Environment
接口访问环境变量:
import org.springframework.core.env.Environment;
@Autowired
private Environment env;
//...
System.out.println(env.getProperty("bar"));
Read more...
【讨论】:
【参考方案5】:您可以将它与@Components 和@service 类的@Value 注解一起使用 如果是普通班,有时它不会起作用
例子:
@Component
public class Testclass
@Value("$MY_SECRET:aDefaultValue")
private String test1;
@Value("#environment.MY_SECRET")
private String test1;
@Value("$myApp.mySecretIndirect:aDefaultValue")
private String test1;
//to get the properties list whih are in "," seperated
@Value("$my.list.of.strings")
private List<String> myList;
【讨论】:
【参考方案6】:是的,你可以。不过大部分回答都没有提到,顺序很重要,请查看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).
的值,因此基本上,您的环境变量具有更高的优先级。
【讨论】:
【参考方案7】:您可以将环境变量放在 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;
【讨论】:
【参考方案8】:首先要在properties配置文件中定义相关的字段信息,然后使用@value来获取和使用 示例:
@Value("$abc")
private String abc;
【讨论】:
以上是关于在 Spring Boot 中读取环境变量的主要内容,如果未能解决你的问题,请参考以下文章
使用环境变量在 Spring Boot 中配置 MongoDB