在SpringBoot中读取环境变量

时间:2017-06-28 12:59:03

标签: java spring spring-boot environment-variables

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

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

是否可以使用@Value注释来完成?

7 个答案:

答案 0 :(得分:16)

引用the documentation

  

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

因此,由于Spring引导允许您使用环境变量进行配置,并且由于Spring引导还允许您使用@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
    }
}

答案 1 :(得分:10)

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

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

如果找不到,您还可以使用冒号来提供默认值:

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

答案 2 :(得分:6)

以下三种“占位符”语法可用于访问名为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(或类似版本)内部使用它。如果您希望在单元测试期间使用它,还可以使用额外的gocha-请参阅我对Why is my Spring @Autowired field null?

的回答

答案 3 :(得分:2)

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

@Autowired
private Environment env;

...

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

Read more...

答案 4 :(得分:0)

您可以将它与@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;
}

答案 5 :(得分:0)

是的,你可以。但是,大多数答案都没有提到,排序非常重要,请检查此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). 的值,因此基本上,您的环境变量具有更高的优先级。

答案 6 :(得分:0)

您可以将环境变量放在 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;

}