Spring Boot「08」设置和使用 Property
Spring Boot 中的一个显著特性就是对外部化配置(externalized configuration)的支持。今天我们将围绕两个问题来学习下 Spring / Spring Boot 中如何使用外部配置文件的。首先,我们先来了解下如何向 Spring 框架中注册一个配置文件和如何使用配置文件中的值。然后,我们会一块学习下 Spring Boot 是如何简化和增强 Spring 框架中对外部配置文件的注册和使用的。好了,废话不多说,让我们直奔主题吧。
01-注册 Property 文件
使用@PropertySource
注解,通过指定属性文件路径,Spring 框架会自动加载属性文件中的内容,并将加载到的属性添加到 Environment 中。这就是 Spring 框架提供的机制。其使用示例如下:
注:在指定属性文件路径时,支持使用现有的属性值作为占位符,例如:
Java 8 及以上版本支持上述写法来引入多个属性文件。如果使用 Java 7 及以下版本,可以使用@PropertyResources
来同时引入多个属性文件。下述为 Java 7 及以下版本的等价写法:
02-使用 Property
两种方式:
@Value
注解,其 value 值可以是属性占位符${...}
或者 SpEL 表达式#{...}
。实现
EnvironmentAware
接口获得 Environment 对象,然后调用其 getProperty 方法,获得注册在 Environment 中的属性值。
03-Spring Boot 中对 Property 的高级特性
默认情况下,Spring Boot 启动时会自动加载如下路径中的 application.properties 和 application.yaml 属性文件:
optional:classpath:/;optional:classpath:/config/
optional:file:./;optional:file:./config/;optional:file:./config/*/
注意:optional 意味可选地、非必须的,若没有 optional,Spring Boot 在找不到文件时,会抛 ConfigDataLocationNotFoundException 异常;以";"分割的多个文件或路径同属一个 group;当值为路径时,必须以"/"或"/"结尾;""为通配符,仅用在值为路径时,且只能出现一次,且只能以"*/"结尾方式出现
加载的属性文件会被添加到 Environment 中的 PropertySources 中。
使用spring.config.location
会替换掉默认的查找路径,如果想加载额外的查找路径,可以使用spring.config.additional-location
。例如,如果不设置spring.config.location
,而设置spring.config.additional-location=optional:classpath:/custom-config/,optional:file:./custom-config/
,则 Spring Boot 的查找路径为:
optional:classpath:/;optional:classpath:/config/
optional:file:./;optional:file:./config/;optional:file:./config/*/
optional:classpath:/custom-config/
optional:file:./custom-config/
通过spring.config.name
可以改变 Spring Boot 将要寻找的属性文件的名称,例如spring.config.name=myConfig
,则 Spring Boot 会在上述路径中查找 myConfig.properties 和 myConfig.yaml 文件,而非 application.properties 和 application.yaml
spring.config.name/spring.config.location/spring.config.additional-location 变量必须在应用启动之前就设置(即可以在 environment / system / 命令行等中指定)envrionment
Spring Boot 中有 profile 的概念,并可通过spring.profiles.active
属性值来控制激活某个或某些 profile。之后,Spring Boot 会自动在上述路径加载 application-${active_profile}.properties 文件。application.properties 文件仍会被加载,不过其中的变量值会被 application-${active_profile}.properties 中对应的值覆盖。
通常spring.config.location
只会指定一个文件或一个路径,不过也可指定多个,例如--spring.config.location=classpath:application.properties,classpath:config/application.properties
。
注意:这里","与上文提到的 group 中";"的区别:
假设,spring.profiles.active=prod,live,而且有如下三个属性文件:
/cfg
application-live.properties
/ext
application-live.properties
application-prod.properties
比较下 spring.config.location=classpath:/cfg/;classpath:/ext/ 与 spring.config.location= classpath:/cfg/,classpath:/ext/ 的区别?
前者,加载的属性文件及顺序为:
/ext/application-prod.properties
/cfg/application-live.properties
/ext/application-live.properties
后者,加载的属性文件及顺序为:
/cfg/application-live.properties
/ext/application-prod.properties
/ext/application-live.properties
在单元测试时,Spring Boot 会自动在 test classpath 下查找 application.properties 和 application.yaml 属性文件。在测试类上,可以通过@TestPropertySource
指定加载特定的属性文件、或指定多个属性值,或通过@TestPropertySources
加载多个属性文件。
版权声明: 本文为 InfoQ 作者【Samson】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3fcee7afc86542a1e4a94326】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论