在 SpringBoot 中读取 环境变量 的最佳方式是什么?
在 Java 中,我使用以下代码实现:
String foo = System.getenv("bar");
使用@Value
注解是否可以做到呢?
在 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("${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
(或类似组件)内使用。如果您希望在单元测试期间使其正常工作,则还有其他注意事项--请参阅我的答案Why is my Spring @Autowired field null?
environment.
时,请注意不同的标点符号 #{
和 ${}
。 - Brent Bradburnorg.springframework.core.env.Environment
接口来访问环境变量(注意:这仅适用于已初始化的Spring组件):import org.springframework.core.env.Environment;
@Autowired
private Environment env;
//...
System.out.println(env.getProperty("bar"));
@SpringBootApplication
类的主静态函数中工作。 - e-info128是的,你可以。然而,大多数答案没有提到,顺序非常重要,请查看此https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/boot-features-external-config.html。
你的操作系统环境变量
将覆盖来自应用程序属性(application.properties和YAML变体)打包在你的jar文件中的值
,因此基本上,你的环境变量具有更高的优先级。
您可以将环境变量放置在 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;
}
您可以在@Component
和@Service
类中使用@Value
注释。
有时,如果它是普通类,则无法正常工作。
例如:
@Component
public class Testclass{
@Value("${MY_SECRET:aDefaultValue}")
private String test1;
@Value("#{environment.MY_SECRET}")
private String test2;
@Value("${myApp.mySecretIndirect:aDefaultValue}")
private String test3;
//to get the properties list which are in "," separated
@Value("${my.list.of.strings}")
private List<String> myList;
}
public static void main(String[] args) {
ApplicationContext applicationContext = new SpringApplicationBuilder(MyApp.class).run(args);
Environment environment = applicationContext.getEnvironment();
System.out.println(environment.getProperty("spring.application.name"));
System.out.println(environment.getProperty("foo.bar"));
}
@Value("${abc}")
private String abc;
@Entity
类中使用它,例如用于 getter,该怎么办? - nonNumericalFloat