在Spring Boot中,我们经常需要从配置文件中读取属性,并将它们注入到Java类中。有两种常见的方式可以实现这个目的:使用@ConfigurationProperties
注解和@Value
注解。这篇博客将深入比较这两种方式的特性和用法。
1. @ConfigurationProperties
@ConfigurationProperties
注解提供了一种批量注入配置文件属性的方式。通过它,我们可以将配置文件中的属性值映射到Java类的字段上。它支持松散绑定,允许使用不同的命名规范。
1.1 命名规范
- 仅能使用纯小写字母、数字以及中划线作为合法字符。
1.2 优势
- 批量注入:可以一次性地将多个属性值注入到同一个Java类中。
- 松散绑定:支持不同命名规范,提供更灵活的配置项。
1.3 功能
- 松散绑定:支持
- SpEL:不支持
- JSR303:支持
- 复杂类型封装:支持
2. @Value
@Value
注解是另一种从配置文件中读取属性的方式,但它是基于单个属性的注入。每个属性都需要使用@Value
注解单独注入。
2.1 命名规范
- 无特殊规范,可以直接使用属性名。
2.2 劣势
- 单个注入:每个属性都需要单独指定。
- 不支持松散绑定:属性名必须与配置文件中的完全一致。
2.3 功能
- 松散绑定:不支持
- SpEL:支持
- JSR303:不支持
- 复杂类型封装:不支持
3. 比较总结
通过对比,我们可以得出以下结论:
@ConfigurationProperties
适合批量注入配置文件属性,支持松散绑定和JSR303校验,适用于复杂的配置项。@Value
适合单个属性的注入,支持SpEL表达式,适用于简单的配置项。
使用的部分截图如下:
@ConfigurationProperties绑定属性支持属性名宽松绑定
下面几种模式都是可以被上面识别
绑定前缀名命名规范:仅能使用纯小写字母,数字。中划线作为合法的字符(其他的就会有如下报错)
Prefix must be in canonical form 翻译后如下:
修改后
OK
与@Value区别:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |