SpringApplication
从以下位置的application.properties
文件加载属性,并将它们添加到Spring Environment中去,优先级如下:
/config
子目录(src\config)/config
包(是指src\main\resources\config)列表按优先级排序(在列表中较高位置定义的属性将覆盖在较低位置中定义的属性)。
如果不喜欢application.properties
作为配置文件名,则可以通过指定spring.config.name
环境属性来切换到另一个文件名。您还可以使用spring.config.location
环境属性(以逗号分隔的目录位置或文件路径列表)来引用显式位置。以下示例显示如何指定其他文件名:
$ java -jar myproject.jar --spring.config.name=myproject
以下示例显示如何指定两个位置:
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
application.properties
中的值在使用时通过现有的Environment
进行过滤,因此您可以返回先前定义的值(例如,从系统属性中)。
- app.name=MyApp
- app.description=${app.name} is a Spring Boot application
YAML是JSON的超集,因此是用于指定分层配置数据的便捷格式。只要在类路径上有SnakeYAML库,SpringApplication
类就会自动支持YAML作为属性的替代 。
Spring Framework提供了两个方便的类,可用于加载YAML文档。YamlPropertiesFactoryBean
将YAML加载为Properties
,YamlMapFactoryBean
将YAML加载为Map
。
例如:
- environments:
- dev:
- url: http://dev.example.com
- name: Developer Setup
- prod:
- url: http://another.example.com
- name: My Cool App
前面的示例将转换为以下属性:
- environments.dev.url=http://dev.example.com
- environments.dev.name=Developer Setup
- environments.prod.url=http://another.example.com
- environments.prod.name=My Cool App
YAML列表表示为具有[index]
解除引用的属性键。例如,考虑以下YAML:
- my:
- servers:
- - dev.example.com
- - another.example.com
前面的示例将转换为这些属性:
- my.servers[0]=dev.example.com
- my.servers[1]=another.example.com
绑定到实体类上:
- @ConfigurationProperties(prefix="my")
- public class Config {
-
- private List
servers = new ArrayList(); -
- public List
getServers() { - return this.servers;
- }
- }
缺点:
无法使用@PropertySource
注释加载YAML文件。因此,如果您需要以这种方式加载值,则需要使用属性文件。
例如,假设一个MyPojo
对象,其name
和description
属性默认为null
。以下示例公开了来自AcmeProperties
的MyPojo
对象的列表:
- @ConfigurationProperties("acme")
- public class AcmeProperties {
-
- private final List
list = new ArrayList<>(); -
- public List
getList() { - return this.list;
- }
-
- }
配置:
- acme:
- list:
- - name: my name
- description: my description
- ---
- spring:
- profiles: dev
- acme:
- list:
- - name: my another name
对于Map
属性,您可以绑定从多个源中提取的属性值。但是,对于多个源中的相同属性,使用具有最高优先级的属性。以下示例从AcmeProperties
公开Map
:
- @ConfigurationProperties("acme")
- public class AcmeProperties {
-
- private final Map
map = new HashMap<>(); -
- public Map
getMap() { - return this.map;
- }
-
- }
请考虑以下配置:
- acme:
- map:
- key1:
- name: my name 1
- description: my description 1
- ---
- spring:
- profiles: dev
- acme:
- map:
- key1:
- name: dev name 1
- key2:
- name: dev name 2
- description: dev description 2