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.*;
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
在您的应用程序类路径上(例如,在jar内),可以使用一个为name
提供合理的默认属性值的application.properties
文件。在新环境中运行时,可以在jar外部提供一个application.properties
文件,该文件将覆盖name
属性的值。对于一次性测试,可以使用特定的命令行开关(例如,java -jar app.jar --name="Spring"
)启动。