Springboot允许您将配置外部化,以便在不同的环境中使用相同的应用程序代码。可以使用properties文件、yaml文件、环境变量和命令行参数来外部化配置。属性值可以通过使用@Value注释直接注入bean,通过Spring的环境抽象访问,或者通过@ConfigurationProperties绑定到结构化对象。

Springboo使用了一个非常特殊的 PropertySource 顺序,该顺序设计为允许合理地覆盖值。属性按以下顺序考虑:

1、开发工具主目录上的全局设置属性(~/.spring-boot-devtools.properties,当开发工具处于活动状态时)
2、测试中的@TestPropertySource注解
3、测试的属性。在@SpringBootTest和测试注释上提供,用于测试应用程序的特定部分。
4、命令行参数
5、SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联json)。
6、ServletConfig 初始化参数
7、ServletContext 初始化参数
8、java:comp/env的JNDI参数
9、Java系统属性(System.getProperties()).
10、操作系统环境变量.
11、RandomValuePropertySource,其属性仅为random.*
12、在打包的JAR之外配置特定的应用程序属性(application-{profile}.properties和yaml变量)。
13、在打包的JAR之中配置特定的应用程序属性(application-{profile}.properties和yaml变量)
14、打包JAR之外的应用程序属性(application.properties和yaml变量)。
15、打包JAR之内的应用程序属性(application.properties和yaml变量)。
16、@PropertySource注解在你的@Configuration 类.
17、默认属性(通过设置SpringApplication.setDefaultProperties指定)。
为了提供一个具体的示例,假设您开发了一个使用name属性的@Component,如下例所示:

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

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

可以在命令行上使用环境变量提供SPRING_APPLICATION_JSON属性。例如,可以在un*x shell中使用以下行:

$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}'  java -jar myapp.jar

在前面的示例中,您将在Spring环境中得到 acme.name=test。您还可以在系统属性中以spring.application.json的形式提供json,如下例所示:

$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar

还可以使用命令行参数提供JSON,如下例所示:

$ java -jar myapp.jar --spring.application.json='{"name":"test"}'

您还可以将JSON提供为JNDI变量,如下:java:comp/env/spring.application.json