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) ...