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作为一种特殊的排序机制。这个机制被设计成能够灵活地覆盖配置值。

設定值將按照以下優先順序應用:

    1. 家目錄下的Devtools全局設定屬性(如果devtools處於活動狀態,則為〜/.spring-boot-devtools.properties)。

 

    1. 測試中的@TestPropertySource註解。

 

    1. 測試屬性。這可以與@SpringBootTest和其他用於測試應用程序特定部分的測試註解一起使用。

 

    1. 命令行參數。

 

    1. 設置在SPRING_APPLICATION_JSON中的屬性(嵌入在環境變量或系統屬性中的內聯JSON)。

 

    1. ServletConfig初始化參數。

 

    1. ServletContext初始化參數。

 

    1. 源自java:comp/env的JNDI屬性。

 

    1. Java系統屬性(System.getProperties())。

 

    1. 操作系統的環境變量。

 

    1. 僅具有random.*屬性的RandomValuePropertySource。

 

    1. 用於特定配置文件的未打包成JAR的應用程序屬性(application-{profile}.properties和YAML)。

 

    1. 用於特定配置文件的已打包成JAR的應用程序屬性(application-{profile}.properties和YAML)。

 

    1. 未打包成JAR的應用程序屬性(application.properties和YAML)。

 

    1. 已打包成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顺序,旨在允许合理地覆盖值。属性按照以下顺序进行考虑:

    1. 开发工具的全局设置属性位于你的主目录下(当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)。”

广告
将在 10 秒后关闭
bannerAds