24.外化配置
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
Spring Boot允许将配置外部化(externalize),这样你就能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外部化配置。使用@Value注解,可以直接将属性值注入到beans中,然后通过Spring的Environment
抽象或通过@ConfigurationProperties
来访问。
Spring Boot设计了一个非常特别的PropertySource
顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值:
home目录下的(~/.spring-boot-devtools.properties
,如果devtools激活)。
测试用例上的注解。
测试用例上的注解。
命令行参数
来自SPRING_APPLICATION_JSON
的属性(环境变量或系统属性中内嵌的内联JSON)。
ServletConfig
初始化参数。
ServletContext
初始化参数。
来自于java:comp/env
的JNDI属性。
Java系统属性(System.getProperties())。
操作系统环境变量。
RandomValuePropertySource,只包含random.*
中的属性。
没有打进jar包的(application-{profile}.properties
和YAML变量)。
打进jar包中的(application-{profile}.properties
和YAML变量)。
没有打进jar包的应用配置(application.properties
和YAML变量)。
打进jar包中的应用配置(application.properties
和YAML变量)。
@Configuration
类上的。
默认属性(通过设置SpringApplication.setDefaultProperties
指定)。
下面是具体的示例,假设你开发一个使用name属性的@Component
:
你可以将一个application.properties
放到应用的classpath下,为name
提供一个合适的默认属性值。当在新的环境中运行时,可以在jar包外提供一个application.properties
覆盖name
属性。对于一次性的测试,你可以使用特定的命令行开关启动应用(比如,java -jar app.jar --name="Spring"
)。
注 SPRING_APPLICATION_JSON
属性可以通过命令行的环境变量设置,例如,在一个UNIX shell中可以这样:
在之前的例子里,如果是Spring Environment
,你可以以acme.name=test
结尾;如果在一个系统属性中,可以提供作为spring.application.json
的JSON字符串:
或命令行参数:
或作为一个JNDI变量java:comp/env/spring.application.json
。