在应用中管理配置并非一个容易的任务,尤为是在应用须要部署到多个环境中时。一般会须要为每一个环境提供一个对应的属性文件,用来配置各自的数据库链接信息、服务器信息和第三方服务帐号等。一般的应用部署会包含开发、测试和生产等若干个环境。不一样的环境之间的配置存在覆盖关系。测试环境中的配置会覆盖开发环境,而生产环境中的配置会覆盖测试环境。Spring 框架自己提供了多种的方式来管理配置属性文件。Spring 3.1 以前可使用 PropertyPlaceholderConfigurer。Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不一样环境和配置文件的方式。不过 Spring 这些配置管理方式的问题在于选择太多,让开发人员无所适从。Spring Boot 提供了一种统一的方式来管理应用的配置,容许开发人员使用属性文件、YAML 文件、环境变量和命令行参数来定义优先级不一样的配置值。
<!-- more -->html
Spring Boot 可使用外部化配置来方便在不一样环境的运行一样的程序java
Spring Boot 实现了不少PropertySource
,按如下顺序,进行合理的相同属性的覆盖:git
System.getProperties()
).application-{profile}.properties
和YAML变量).application-{profile}.properties
and YAML 变量).application.properties
and YAML 变量).application.properties
and YAML 变量).@Configuration
类上@PropertySource
注解.Note:github
Relaxed Binding(宽松绑定规则)spring
Property | Note |
---|---|
acme.my-project.person.first-name |
建议在 .properties and .yml 文件中使用. |
acme.myProject.person.firstName |
标准的驼峰命名 |
acme.my_project.person.first_name |
下划线命名, .properties and .yml 文件中使用. |
ACME_MYPROJECT_PERSON_FIRSTNAME |
大写下划线命名, 在环境变量中使用. |
注意:数据库
- 在尽量的状况下,请使用小写的短横线命名的方法会,好比:
my.property-name=acme
- 在注解@ConfigurationProperties中定义或者在@ConditionalOnProperty的时候属性名前缀的时候必须使用短横分隔命名,而且必须小写,只有注解中命名的时候必须遵照这个命名规则。我发现有些文章描述这个变化是不许确的,并非全部状况下都是须要这样,好比我能够在配置文件中使用上述表格中的命名方式。
RelaxedPropertyResolver
类解析工具被删除掉,由Environment
类代替RelaxedDataBinder
类绑定工具类被删除掉,在2.0.0以后使用Binder
类,以下使用方式api
MyProperties target = Binder.get(environment) .bind("app.acme", MyProperties.class) .orElse(null); FlagType flagType = Binder.get(environment) .bind("acme.app.my-flag", FlagType.class) .orElse(FlagType.DEFAULT);
若是在2.0以后的版本须要在@ConfigurationProperties
配置的类中使用验证必须使用@Validated
注解服务器
spring.config.location
属性在2.0以前的版本中会默认增长一个新的文件目录或者文件,在2.0的版本中,若是还要使用以前的功能,请使用spring.config.additional-locationapp