Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java的properties文件、YAML文件、环境变量和命令行参数。
    属性值可以通过@Value注释直接注入到你的bean中,通过Spring的Environment抽象或者通过@ConfigurationProperties绑定到结构化对象进行访问。
    Spring Boot使用了一个非常特殊的PropertySource顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性(下面的覆盖上面的项):

    1. 默认属性(通过设置SpringApplication.setDefaultProperties指定)。
    2. @Configuration类上的@PropertySource注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到Environment中。用这种方法配置某些属性(如,logging.*spring.main.*在刷新开始之前就要先读取)显得为时已晚。
    3. 配置数据(例如application.properties文件)。
    4. RandomValuePropertySource,只有在random.*拥有的属性。
    5. 操作系统环境变量。
    6. Java系统属性(System.getProperties())。
    7. java:comp/env的JNDI属性。
    8. ServletContext的 初始化参数。
    9. ServletConfig 的初始化参数。
    10. 来自SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的嵌入式JSON)的属性。
    11. 命令行参数。
    12. 测试中的properties属性。在[@SpringBootTest](https://docs.spring.io/spring-boot/docs/2.4.0-SNAPSHOT/api/org/springframework/boot/test/context/SpringBootTest.html)上提供,此测试注解用于测试应用程序的特定部分
    13. 测试中的@TestPropertySource注释。
    14. 当devtools处于活动状态时,$HOME/.config/spring-boot目录中的Devtools全局设置属性

    配置数据文件按以下顺序考虑(下面的优先级高于上面):

    1. 打包在jar中的应用程序属性application.properties和YAML变体)。
    2. 打包在jar中的特定于配置文件的应用程序属性application-{profile}.properties和YAML变体)。
    3. 在jar外的应用程序属性application.properties和YAML变体)。
    4. 在jar外的特定于配置文件的应用程序属性application-{profile}.properties和YAML变体)。

    为了提供一个具体的示例,假设您开发了一个使用name属性的@Component,如以下示例所示:

    1. import org.springframework.stereotype.*;
    2. import org.springframework.beans.factory.annotation.*;
    3. @Component
    4. public class MyBean {
    5. @Value("${name}")
    6. private String name;
    7. // ...
    8. }

    在您的应用程序类路径上(例如,在jar内),可以使用一个为name提供合理的默认属性值的application.properties文件。在新环境中运行时,可以在jar外部提供一个application.properties文件,该文件将覆盖name属性的值。对于一次性测试,可以使用特定的命令行开关(例如,java -jar app.jar --name="Spring")启动。