Spring Boot 允许将配置外部化(externalize),这样你就能够在不同的环境下使用相同的代码。你可以使用 properties 文件,YAML 文件,环境变量和命令行参数来外部化配置。
使用 @Value 注解,可以直接将属性值注入到 beans 中,然后通过 Spring 的 Environment 抽象或通过 @ConfigurationProperties 绑定到结构化对象来访问。
Spring Boot 设计了一个非常特别的 PropertySource 顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值:
home 目录下的 devtools 全局设置属性( ~/.spring-boot-devtools.properties)
测试用例上的 @TestPropertySource 注解
测试用例上的 @SpringBootTest 注解
命令行参数
来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中内嵌的内联 JSON)
ServletConfig 初始化参数
ServletContext 初始化参数
来自于 java:comp/env 的 JNDI 属性
Java 系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource,只包含 random.* 中的属性
没有打进 jar 包的 Profile-specific 应用属性(application-{profile}.properties 和 YAML 变量)
打进 jar 包中的 Profile-specific 应用属性( application-{profile}.properties 和 YAML 变量)
没有打进 jar 包的应用配置(application.properties 和 YAML 变量)
打进 jar 包中的应用配置(application.properties 和 YAML 变量)
@Configuration 类上的 @PropertySource 注解
默认属性(使用 SpringApplication.setDefaultProperties 指定)
下面是具体的示例,假设你开发一个使用name属性的 @Component :
import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
@Component
public class MyBean {
    @Value("${name}") 
    private String name;
    // ... 
}你可以将一个 application.properties 放到应用的 classpath 下,为 name 提供一个合适的默认属性值。当在新的环境中运行时,可以在 jar 包外提供一 个 application.properties 覆盖 name 属性。对于一次性的测试,可以使用命令行参数提供 name 属性,去覆盖默认 name 属性。例如:java -jar app.jar --name="Spring"
SPRING_APPLICATION_JSON 属性可以通过命令行的环境变量设置,例如:
下面演示在 Win10 系统下面设置 SPRING_APPLICATION_JSON 环境变量,然后在 Spring Boot 程序中读取值。实例:
C:\Users\Administrator\Desktop\demo>echo %SPRING_APPLICATION_JSON%
{"json":"variable value"}
C:\Users\Administrator\Desktop\demo>set SPRING_APPLICATION_JSON={"json":"variable value"}
C:\Users\Administrator\Desktop\demo>echo %SPRING_APPLICATION_JSON%
{"json":"variable value"}
C:\Users\Administrator\Desktop\demo>java -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
 ...下面将在 Ubuntu 20 系统下面演示 SPRING_APPLICATION_JSON 环境变量的用法。
(1)直接设置临时 SPRING_APPLICATION_JSON 环境变量,例如:
hxstrive@MS-OYCYMLXUSLLD: demo$ SPRING_APPLICATION_JSON='{"json":"vriable"}' java -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...(2)通过 -D 选项设置 SPRING_APPLICATION_JSON 变量“spring.application.json”,例如:
hxstrive@MS-OYCYMLXUSLLD: demo$ java -Dspring.application.json='{"json":"vriable"}' -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...(3)通过“--key=value”的形式设置 SPRING_APPLICATION_JSON 变量,例如:
hxstrive@MS-OYCYMLXUSLLD: demo$ java -jar demo.jar --spring.application.json='{"json":"vriable"}'
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...
            