@ConfigurationProperties注解

我整理这部分资料,仅仅是查漏补缺,补充一些我不太熟悉的知识。

Spirng的宽松绑定规则

实体中的hostName可以绑定如下配置:


mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOSTNAME

三种方式将一个Bean注入到Spring Context中

  1. 使用@Component注解(前提能够被@ComponentScan扫描)

  2. 通过Java Configuration实现相同的效果(要求PropertiesConfig可以被扫描到)

1
2
3
4
5
6
7
8
9

@Configuration
class PropertiesConfig() {
    @Bean
    public MailModuleProperties mailModuleProperties() {
        return new MailModuleProperties();
    }
}

  1. @EnableConfigurationProperties注解中指定参数(这种方法我用的非常少)
1
2
3
4
5
6
7

@Configuration
@EnableConfigurationProperties(MailModuleProperties.class)
class PropertiesConfig() {

}

至于如何选择这些方法,网上文章的有一些建议,但是我目前不计划采纳这些建议。

ignoreInvalidFields、ignoreUnknownFields配置

这两个属性配置@ConfigurationProperties中,我觉得是有一定价值的,毕竟开发该属性配置信息的人最清楚如果配置文件中的配置值非法或者未知,该如何处理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

@Data
@ConfigurationProperties(prefix = "myapp.mail", ignoreInvalidFields=true)
public class MailModuleProperties{
    private Boolean enabled = Boolean.TRUE;
}

@Data
@ConfigurationProperties(prefix = "myapp.mail", ignoreUnknownFields=false)
public class MailModuleProperties{
    private Boolean enabled = Boolean.TRUE;
}

备注:ignoreUnknownFields未来可能会被删除,存在两个Properties绑定到一个命名空间上,其中一个类知道某个属性,而另一个不知道。(额,好吧)

支持@Validate

1
2
3
4
5
6
7
8
9

@Data
@Validate
@ConfigurationProperties(prefix = "myapp.mail", ignoreUnknownFields=false)
public class MailModuleProperties{
    @NotNull
    private Boolean enabled;
}

Duration与DataSize

SpringBoot内置支持从配置参数中解析durations和data size。duration和data size单位如下:


ns: 纳秒
us:微秒
ms:毫秒
s :秒
m :分
h :时
d :天

B
KB
MB
GB
TB

配置案例如下:


myapp.mail.pause-between-mails = 5s
myapp.mail.max-attachment-size = 1MB

对应的Java代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

import org.springframework.util.unit.DataSize;
import java.time.Duration;

@DurationUnit(ChronoUnit.SECONDS)
private Duration pauseBetweenMails;

@DataSizeUnit(DataUnit.MEGABYES)
private DataSize maxAttachmentSize = DataSize.ofMegabytes(2);

Duration和DataSize这些类我几乎没有用过,这也说明我开发的复杂业务逻辑还是太少了,对JAVA了解的还仅仅只是一个皮毛。

使用Spring Boot Configuration Processor完成自动补全

添加依赖如下:

1
2
3
4
5
6
7

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

需要重新Build一下(对应到Idea中就是重新启动一下),这时我们在编辑application.yml时就会有自动提示了。

Build后会生成一份json文件,相关的提示信息就存储在这份json文件中:

2021-07-07-12-14-24

我一直在用这个依赖,但是从来不知道我们的自动提示功能是有这个依赖提供的,而且这个依赖还可以对我们自己开发的配置进行自动提示。

编辑配置属性为Deprecated

案例代码如下:

1
2
3
4
5
6

@DeprecatedConfigurationProperty(reason = "No Need Now", replacement = "none")
public String getDefaultSubjects() {

}

比较糟心的是,这个注解只能注册到方法上,为了使用这个注解我们还需要开发一个Getter方法,使用lombok时非常的不爽。

@ConfigurationProperties注解不支持SpEL表达式

我目前对SpEL表达式的需求还比较少,先持续关注一些这个问题。

@ConfigurationProperties、@PropertySource

@ConfigurationProperties支持和@PropertySource结合,读取指定文件,博客上说只能用于properties文件,但是我记得在我的实验中,貌似也是支持yaml文件的。

我目前对该技术没有太大的需求,所以暂时不研究。

@ConfigurationProperties与@Value的对比

2021-07-07-12-21-16

@Value与@ConfigurationProperties涉及到的源码

1
2
3
4
5
6
7
8
9

@Value

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

@ConfigurationProperties

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

这是好东西,深入学习SpringBoot是没有办法避免研究这些的。

参考资料

  1. @ConfigurationProperties 注解使用姿势,这一篇就够了

  2. SpringBoot配置中@ConfigurationProperties和@Value的区别