Java 读取SpringBoot中的环境变量

Java 读取SpringBoot中的环境变量,java,spring,spring-boot,environment-variables,Java,Spring,Spring Boot,Environment Variables,在SpringBoot中读取环境变量的最佳方法是什么? 在Java中,我使用了: String foo = System.getenv("bar"); 是否可以使用@Value注释执行此操作?您可以使用@Value注释执行此操作: @Value("${bar}") private String myVariable; 如果找不到,也可以使用冒号提供默认值: @Value("${bar:default_value}") private String myVariable; 引述: Sprin

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

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

是否可以使用
@Value
注释执行此操作?

您可以使用@Value注释执行此操作:

@Value("${bar}")
private String myVariable;
如果找不到,也可以使用冒号提供默认值:

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

SpringBoot允许您将配置外部化,以便在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML文件、环境变量和命令行参数来外部化配置。属性值可以使用
@Value
注释直接注入到bean中,通过Spring的
环境
抽象访问,或者通过
@ConfigurationProperties
绑定到结构化对象

因此,由于Spring boot允许您使用环境变量进行配置,并且Spring boot还允许您使用
@Value
从配置中读取属性,因此答案是肯定的


这可以很容易地进行测试,以下将给出相同的结果:

@组件
公共类TestRunner实现CommandLineRunner{
@值(“${bar}”)
私人弦杆;
私有最终记录器Logger=LoggerFactory.getLogger(getClass());
@凌驾
公共无效运行(字符串…字符串)引发异常{
info(“Foo from@Value:{}”,bar);
logger.info(“来自System.getenv()的Foo:{}”,System.getenv(“bar”);//与上面的行相同的输出
}
}
这里有三个“占位符”语法,用于访问名为
MY\u 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
起作用,必须在活动
@组件
(或类似组件)中使用。如果您想在单元测试期间实现这一点,还需要额外的gochas——请参见我对

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

@Autowired
private Environment env;

...

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

您可以将它与@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;
}
@组件
公共类Testclass{
@值(${MY_SECRET:aDefaultValue}”)
私有字符串test1;
@值(“#{environment.MY#u SECRET}”)
私有字符串test1;
@值(${myApp.mySecretIndirect:aDefaultValue}”)
私有字符串test1;
//要获取属性列表,请使用“,”分隔
@值(${my.list.of.strings}”)
私人名单;
}

是的,你可以。然而,大多数答案没有提到,订购是非常重要的,请检查这个


您的
OS环境变量
将覆盖来自jar中打包的
应用程序属性(Application.properties和YAML变体)的值。
,因此基本上,您的环境变量具有更高的优先级。

请注意不同的标点符号
。{
${
在使用
环境时。
我认为您有一个输入错误@Value(“{environment.MY_SECRET}”)应该与$@dgraf在一起,请参见前面的注释(由我提供)——这是有意的。这是一个模糊的功能,但您可以通过查找来找到它的文档。