Spring Boot允许您外部化配置,以便在不同的环境下使用相同的程序代码。您可以使用properties文件、YAML文件、环境变量以及命令行参数来外部化配置。通过Spring的Environment抽象访问或通过@ConfigurationProperties绑定到结构化对象,可以使用@Value注解将属性值直接注入到bean中。
Spring Boot使用一个非常特别的PropertySource加载顺序,旨在允许合理地覆盖属性值。属性按以下顺序:
- 在您主目录上的devtools全局设置属性(
~/.spring-boot-devtools.properties文件,若启用了devtools) - 您测试用例上的
@TestPropertySource注解 - 您测试用例上的
@SpringBootTest#properties注解 - 命令行参数
SPRING_APPLICATION_JSON(嵌在环境变量或系统属性中的内联JSON)配置的属性ServletConfig初始化参数ServletContext初始化参数java:comp/env配置的JNDI属性- Java系统属性(
System.getProperties()) - 操作系统环境变量
RandomValuePropertySource,它仅含有random.*形式的属性- 不在打包的jar文件内的特定profile的应用程序属性文件(
application-{profile}.properties和YAML变量) - 打包的jar文件内的特定profile的应用程序属性文件(
application-{profile}.properties和YAML变量) - 不在打包的jar文件内的应用程序属性(
application-{profile}.properties和YAML变量) - 打包的jar文件内的应用程序属性(
application-{profile}.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;
// ...
}在您应用程序的类路径上(比如在您的jar中)可以有一个application.properties文件,它为name提供合理的默认属性值。在新环境中运行时,可以在jar文件以外提供一个application.properties用于覆盖name;对于一次性测试,您可以使用特定的命令行参数(比如java -jar app.jar --name="Spring")。
可以在命令行上使用环境变量提供
SPRING_APPLICATION_JSON属性。例如在UN*X shell中: $ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar 在此示例中,最终在SpringEnvironment中将是foo.bar=spam。您还可以在System变量中提供JSON作为spring.application.json: $ java -Dspring.application.json='{"foo":"bar"}' -jar myapp.jar 或是命令行参数: $ java -jar myapp.jar --spring.application.json='{"foo":"bar"}' 或是作为JNDI变量java:comp/env/spring.application.json。