簡體   English   中英

在 SpringBoot 中讀取環境變量

[英]Read environment variable in SpringBoot

SpringBoot 中讀取環境變量的最佳方法是什么?
在Java中,我使用:

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

是否可以使用@Value注釋來實現?

引用文檔

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
    }
}

您可以使用 @Value 注釋來做到這一點:

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

如果未找到,您還可以使用冒號給出默認值:

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

以下是用於訪問名為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 - 請參閱我對為什么我的 Spring @Autowired 字段為空的回答

或者,您可以使用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;
}

是的,你可以。 然而,大多數答案沒有提到,排序非常重要,請檢查這個https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/boot-features-external-配置文件

您的OS environment variables將覆蓋來自Application properties packaged inside your jar (application.properties and YAML variants).的值Application properties packaged inside your jar (application.properties and YAML variants). ,所以基本上,您的環境變量具有更高的優先級。

您可以將環境變量放在 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;

}
    

首先需要在properties配置文件中定義相關字段信息,然后使用@value獲取並使用example:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM