上一篇讲了 Spring Boot 本文介绍了Spring的依赖注入 Boot Spring外部化配置 Boot 初识:
(PropertySource)
加载顺序 Spring Boot 使用一个非常特殊的PropertySource
该顺序旨在允许合理的覆盖值。以下属性源可以覆盖上述定义的值。根据以下顺序考虑来源:
- 默认属性(由
SpringApplication.setDefaultProperties
指定)。 @Configuration
类上的@PropertySource
注意。请注意,在刷新应用程序的上下文之前,此类属性源不会添加到环境中。配置某些属性已经太晚了,比如刷新开始前读取的标志.*和spring.main.*。- 配置数据(例如
application.properties
文件)。 RandomValuePropertySource
加载random.*
形式属性。- 环境变量操作系统。
- Java 系统属性 (
System.getProperties()
)。 - 通过
java:comp/env
配置的 JNDI 属性 ServletContext
初始化参数。ServletConfig
初始化参数。SPRING_APPLICATION_JSON
(内联嵌入环境变量或系统属性 JSON)的属性。- 命令行参数。
- 测试环境中的属性
properties
:@SpringBootTest
和测试注解
。 - 测试中的
@DynamicPropertySource
注释。 - 在测试环境中
@TestPropertySource
注解配置。 Devtools 全局配置
.$HOME/.config/spring-boot (当 devtools 被激活~/.spring-boot-devtools.properties
)
按以下顺序考虑配置数据文件:
- jar 包外的
application-{profile}.properties
或application-{profile}.yml
配置 - jar 包内的
application-{profile}.properties
或application-{profile}.yml
配置 - jar 包外的
application.properties
或application.yml
配置 - jar 包内的
application.properties
或application.yml
配置
默认情况下, SpringApplication
会获取--
参数(例如 --server.port=9000
),并将这个 property
添加到 Spring 的 Environment
中。如前所述,命令行属性始终优先于基于文件的源属性。 如果不想加载命令行属性,可以通过 SpringApplication.setAddCommandLineProperties(false)
禁用。
环境变量和系统属性通常是有限的,这意味着某些属性名称不能使用。为了解决这个问题,Spring Boot 允许您将属性块编码到单个属性块 JSON 结构中。 当您的应用程序启动时,任何spring.application.json
或SPRING_APPLICATION_JSON
所有属性都将被分析和添加Environment
.例如,可以在 UN*X shell 提供命令行SPRING_APPLICATION_JSON
属性作为环境变量:
$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar
在之前的例子中,您最终将进入Spring Environment
的 my.name=test
。同样的, JSON属性也可以提供:
$ java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar
或者json 命令行参数:
$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'
如果要部署到经典的Application Server,您还可以使用名称java:comp/env/spring.application.json
的 JNDI 变量。