参考@ConfigurationProperties 注解使用姿势,这一篇就够了
基本用法
@ConfigurationProperties 的基本用法非常简单:我们为每个要捕获的外部属性提供一个带有字段的类。请注意以下几点:
- 前缀定义了哪些外部属性将绑定到类的字段上
- 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配
- 我们可以简单地用一个值初始化一个字段来定义一个默认值
- 类本身可以是包私有的
- 类的字段必须有公共 setter 方法
Spring 宽松绑定规则 (relaxed binding)
Spring使用一些宽松的绑定属性规则。因此,以下变体都将绑定到 hostName 属性上:
mail.hostName=localhost
mail.hostname=localhost
mail.host_name=localhost
mail.host-name=localhost
激活 @ConfigurationProperties
- 首先,我们可以通过添加 @Component 注解让 Component Scan 扫描到. 很显然,只有当类所在的包被 Spring @ComponentScan 注解扫描到才会生效,默认情况下,该注解会扫描在主应用类下的所有包结构 ``` @Component @ConfigurationProperties(prefix = “myapp.mail”) class MailModuleProps{
}
2. 我们也可以通过 Spring 的 Java Configuration 特性实现同样的效果:
@Configuration class MailModuleCfg{
@ConfigurationProperties(prefix = "myapp.mail")
@Bean
public MailModuleProps mailModuleProps(){
return new MailModuleProps();
} } ```
无法转换的属性
如果我们在 application.properties 属性上定义的属性不能被正确的解析会发生什么?假如我们为原本应该为布尔值的属性提供的值为 ‘foo’:
myapp.mail.enabled=foo
默认情况下,Spring Boot 将会启动失败,并抛出异常:
Failed to bind properties under 'myapp.mail.enabled' to java.lang.Boolean:
Property: myapp.mail.enabled
Value: foo
Origin: class path resource [application.properties]:1:20
Reason: failed to convert java.lang.String to java.lang.Boolean
当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置 ignoreInvalidFields 属性为 true (默认为 false)
@ConfigurationProperties(prefix = "myapp.mail", ignoreInvalidFields = true)
未知的属性
然而,当配置文件中有一个属性实际上没有绑定到 @ConfigurationProperties 类时,我们可能希望启动失败. 也许我们以前使用过这个配置属性,但是它已经被删除了,这种情况我们希望被触发告知手动从 application.properties 删除这个属性
@ConfigurationProperties(prefix = "myapp.mail", ignoreUnknownFields = false)
启动时校验 @ConfigurationProperties
如果我们希望配置参数在传入到应用中时有效的,我们可以通过在字段上添加 bean validation 注解,同时在类上添加 @Validated 注解
复杂属性类型
多数情况,我们传递给应用的参数是基本的字符串或数字。但是,有时我们需要传递诸如 List 的数据类型
List 和 Set
myapp.mail.smtpServers[0]=server1
myapp.mail.smtpServers[1]=server2
myapp:
mail:
smtpServers:
- server1
- server2
Duration
myapp.mail.pause-between-mails=5s
@DurationUnit(ChronoUnit.SECONDS)
private Duration pauseBetweenMails;
DataSize
myapp.mail.max-attachment-size=1MB
@DataSizeUnit(DataUnit.MEGABYTES)
private Duration maxAttachmentSize;
使用 Spring Boot Configuration Processor 完成自动补全
我们向项目中添加依赖:
spring-boot-configuration-processor
重新 build 项目之后,configuration processor 会为我们创建一个 JSON 文件:
这样,当我们在 application.properties 和 application.yml 中写配置的时候会有自动提醒