Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java的properties文件、YAML文件、环境变量和命令行参数。
属性值可以通过@Value注释直接注入到你的bean中,通过Spring的Environment抽象或者通过@ConfigurationProperties绑定到结构化对象进行访问。
Spring Boot使用了一个非常特殊的PropertySource顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性(下面的覆盖上面的项):
- 默认属性(通过设置
SpringApplication.setDefaultProperties指定)。 @Configuration类上的@PropertySource注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到Environment中。用这种方法配置某些属性(如,logging.*和spring.main.*在刷新开始之前就要先读取)显得为时已晚。- 配置数据(例如
application.properties文件)。 RandomValuePropertySource,只有在random.*拥有的属性。- 操作系统环境变量。
- Java系统属性(
System.getProperties())。 java:comp/env的JNDI属性。ServletContext的 初始化参数。ServletConfig的初始化参数。- 来自
SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的嵌入式JSON)的属性。 - 命令行参数。
- 测试中的
properties属性。在[@SpringBootTest](https://docs.spring.io/spring-boot/docs/2.4.0-SNAPSHOT/api/org/springframework/boot/test/context/SpringBootTest.html)上提供,此测试注解用于测试应用程序的特定部分。 - 测试中的
@TestPropertySource注释。 - 当devtools处于活动状态时,
$HOME/.config/spring-boot目录中的Devtools全局设置属性。
配置数据文件按以下顺序考虑(下面的优先级高于上面):
- 打包在jar中的应用程序属性(
application.properties和YAML变体)。 - 打包在jar中的特定于配置文件的应用程序属性(
application-{profile}.properties和YAML变体)。 - 在jar外的应用程序属性(
application.properties和YAML变体)。 - 在jar外的特定于配置文件的应用程序属性(
application-{profile}.properties和YAML变体)。
为了提供一个具体的示例,假设您开发了一个使用name属性的@Component,如以下示例所示:
import org.springframework.stereotype.*;import org.springframework.beans.factory.annotation.*;@Componentpublic class MyBean {@Value("${name}")private String name;// ...}
在您的应用程序类路径上(例如,在jar内),可以使用一个为name提供合理的默认属性值的application.properties文件。在新环境中运行时,可以在jar外部提供一个application.properties文件,该文件将覆盖name属性的值。对于一次性测试,可以使用特定的命令行开关(例如,java -jar app.jar --name="Spring")启动。
