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