[英]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.