Java 读取SpringBoot中的环境变量
在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
在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在一起,请参见前面的注释(由我提供)——这是有意的。这是一个模糊的功能,但您可以通过查找来找到它的文档。