Spring Boot 外部配置值的优先顺序
概述
-
- Spring Boot 2.2.0.M4 の Externalized Configuration (外部設定) の設定値の優先順位についてのドキュメントを日本語に翻訳した
- 原文: Spring Boot Reference Documentation – 4.2. Externalized Configuration
翻译成中文如下:
日语翻译
外部设置 – External configuration/setting
Spring Boot可以通过外部化配置使同一应用代码在不同环境中运行。可使用属性文件、YAML文件、环境变量和命令行参数来进行外部化配置。配置值可以通过使用@Value注解直接注入到Bean中,也可以通过Spring的Environment访问,还可以通过@ConfigurationProperties将其绑定到结构化对象上。
Spring Boot使用PropertySource作为一种特殊的排序机制。这个机制被设计成能够灵活地覆盖配置值。
設定值將按照以下優先順序應用:
-
- 家目錄下的Devtools全局設定屬性(如果devtools處於活動狀態,則為〜/.spring-boot-devtools.properties)。
-
- 測試中的@TestPropertySource註解。
-
- 測試屬性。這可以與@SpringBootTest和其他用於測試應用程序特定部分的測試註解一起使用。
-
- 命令行參數。
-
- 設置在SPRING_APPLICATION_JSON中的屬性(嵌入在環境變量或系統屬性中的內聯JSON)。
-
- ServletConfig初始化參數。
-
- ServletContext初始化參數。
-
- 源自java:comp/env的JNDI屬性。
-
- Java系統屬性(System.getProperties())。
-
- 操作系統的環境變量。
-
- 僅具有random.*屬性的RandomValuePropertySource。
-
- 用於特定配置文件的未打包成JAR的應用程序屬性(application-{profile}.properties和YAML)。
-
- 用於特定配置文件的已打包成JAR的應用程序屬性(application-{profile}.properties和YAML)。
-
- 未打包成JAR的應用程序屬性(application.properties和YAML)。
-
- 已打包成JAR的應用程序屬性(application.properties和YAML)。
@Configuration類的@PropertySource註解。
默認屬性(由SpringApplication.setDefaultProperties指定的設置)。
请用中文将以下内容改写成同义句,只需一种选项:
原文(英语):
– I cannot understand Mandarin easily.
改写后(中文):
– 我很难轻松地理解普通话。
4.2 外部化配置
Spring Boot 允许您外部化配置,以便您可以在不同的环境中处理相同的应用程序代码。您可以使用属性文件、YAML文件、环境变量和命令行参数来外部化配置。通过使用@Value注解,属性值可以直接注入到您的bean中;通过Spring的Environment抽象进行访问;或者通过@ConfigurationProperties绑定到结构化对象中。
Spring Boot使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。属性按照以下顺序进行考虑:
-
- 开发工具的全局设置属性位于你的主目录下(当devtools处于激活状态时为~/.spring-boot-devtools.properties)。
@TestPropertySource注解用于你的测试。
测试中的properties属性。可在@SpringBootTest和用于测试应用程序的特定片段的测试注解上使用。
命令行参数。
来自SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)。
ServletConfig初始化参数。
ServletContext初始化参数。
来自java:comp/env的JNDI属性。
Java系统属性(System.getProperties())。
操作系统环境变量。
仅在random.*属性中的RandomValuePropertySource。
特定于配置文件的应用程序属性不包含在打包的jar文件中(application-{profile}.properties和YAML变体)。
特定于配置文件的应用程序属性包含在打包的jar文件中(application-{profile}.properties和YAML变体)。
不包含在打包的jar文件中的应用程序属性(application.properties和YAML变体)。
包含在打包的jar文件中的应用程序属性(application.properties和YAML变体)。
@Configuration类上的@PropertySource注解。
默认属性(通过设置SpringApplication.setDefaultProperties指定)。
優先順序的操作驗證
运行示例代码,以确认优先顺序。
应用程序配置文件
在 application.properties 文件中写入配置值。
message=Hello, application.properties!
Application.java 申请.java
package sample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
控制器.java
将设定值message以JSON格式返回。
package sample;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
@Value("${message}")
private String message;
@RequestMapping("/")
public HashMap<String, Object> index() {
return new HashMap<String, Object>() {
{
put("message", message);
}
};
}
}
一个应用程序正是实施 application.properties 的例子。
使用Java命令运行Spring Boot服务器。
$ java -jar target/sample.jar
当访问服务器时,将返回在 application.properties 文件中指定的 message 设置值。
$ curl http://localhost:8080/
{"message":"Hello, application.properties!"}
這是一個適用Java系統屬性的例子。
在Java中,使用”-D”参数将JSON指定给spring.application.json系统属性,并使用java命令执行Spring Boot服务器。
$ java -Dspring.application.json='{"message":"Hello, Java System properties!"}' -jar target/sample.jar
当访问服务器时,将返回指定的Java系统属性中的message设置值。
$ curl http://localhost:8080/
{"message":"Hello, Java System properties!"}
不是application.properties,而是优先采用Java的系统属性。
这是根据列表中的9号和15号优先顺序确定的,因为9号的优先级较高。
“9. Java的系统属性(System.getProperties())。
“15. 打包在JAR中的应用属性(application-{profile}.properties和YAML)。”