@ConfigurationProperties

@ConfigurationProperties

概念

@ConfigurationProperties 是Spring框架中的一个核心注解。

这个注解主要用于将一组相关的配置属性从配置文件(如 application.propertiesapplication.yml )集中绑定到一个Java对象上,从而实现配置的类型安全和结构化管理。

这样做不仅可以减少硬编码,还能利用IDE的代码补全和类型检查功能,提高开发效率和配置的可维护性。

通俗说法

想象一下,@ConfigurationProperties 就像是一位细心的管家,它会从你家的“配置仓库”(配置文件)中,按照你留下的清单(配置属性的前缀),打包好所有你需要的物品(配置值),然后整齐地摆放到你的“储物间”(一个Java类)里。这样,你就可以在需要的时候,直接从储物间里拿出整套物品,而不需要逐个去仓库寻找,既方便又不容易出错。

所属

import org.springframework.boot.context.properties.ConfigurationProperties;

作用

  • 集中管理配置: 将分散在配置文件中的相关属性集中到一个Java Bean中,便于管理和维护。
  • 类型安全: 避免硬编码和字符串解析错误,提供编译时检查。
  • 简化代码: 减少重复的 @Value 注解,使代码更加清晰和模块化。

用法

  • 定义配置类: 创建一个Java类,并使用 @ConfigurationProperties 注解标记。通常需要指定 prefix 属性来指明配置文件中对应的属性前缀。
  • 启用配置绑定: 在Spring Boot应用中,可以通过在配置类上加 @EnableConfigurationProperties 或在主类上加 @SpringBootApplication 自动发现配置类,也可以通过 @Component 让Spring扫描到。

推荐:最好显性的在配置类上添加@EnableConfigurationProperties 或者 @Component 注解,这样既提高配置的可预测性和稳定性,又明确表明类的作用和意图,提高了代码可读性。

使用场景

  • 数据库配置: 管理数据库连接信息,如URL、用户名、密码等。
  • 服务配置: 如邮件服务、第三方API密钥等外部服务的配置。
  • 自定义组件配置: 为自定义的Spring组件提供配置支持。

使用示例

示例1:数据库配置

application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret

DataSourceConfig.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
    private String url;
    private String username;
    private String password;

    // Getter and Setter methods...
}

示例1中,prefix 属性值 spring.datasource 意味着配置文件中以 spring.datasource. 开头的所有属性都将映射到这个类的相应字段上。

例如,spring.datasource.url 对应url字段,spring.datasource.username 对应 username 字段,依此类推。

通过这种方式,可以方便地将配置文件中的相关属性组织在一起,并以类型安全的方式注入到Java对象中。

示例2:自定义组件配置

假设我们有一个日志服务需要配置。

application.yml

myapp.logging:
  level: INFO
  file-path: /var/log/app.log

LoggingProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "myapp.logging")
public class LoggingProperties {
    private String level;
    private String filePath;

    // Getter and Setter methods...
}

此处的 @ConfigurationProperties 用法类似于示例1。

在YAML配置文件中使用 file-path ,而在Java类中定义为 filePath ,两者之间能够成功对应并注入,是因为Spring在处理属性名称时是不区分大小写的,并且能够自动适应不同命名规范的映射。

具体来说,Spring Boot在进行 @ConfigurationProperties 绑定时,会遵循以下规则:

  • 驼峰式匹配: Spring Boot默认会将配置文件中的属性名(通常是kebab-case,即短横线分隔的单词,如 file-path)转换为Java领域的驼峰命名法(camelCase,如 filePath ),这使得属性值能够匹配到Java类中的字段。

  • 忽略大小写: 在映射过程中,Spring是不敏感大小写的,所以即使YAML文件中的属性名全部小写,只要去掉短横线并相应调整为驼峰式,就能匹配到Java类中的相应字段。比如:YAML中的 setting 可以对应java文件中的 Setting 字段。

  • 宽松绑定: Spring Boot提供了一种宽松的绑定策略,这意味着即使配置属性名称和Java字段名称不是完全一致,只要能通过上述规则转换后相匹配,就能成功注入。比如:YAML中的 max-connections 可以对应java文件中的 maxConnections 字段。

这一设计提高了配置的灵活性和易用性,开发者不必严格遵循相同的命名规则。

注意

注意1

这个宽松的映射规则对于 @Value 注解是不适用的,@Value 要求属性名称与配置文件中的键值严格匹配,包括大小写和分隔符。

比如此处就应该这样对应:

@Value("${file-path}")
private String filePath;

注意2

@ConfigurationProperties 前缀(prefix)匹配是严格的,不涉及大小写的自动转换。

例如:当你定义 @ConfigurationProperties(prefix = "my-config") 时,即使YAML配置文件中使用了 My_Config 作为前缀,没有匹配到定义的 my-config 前缀,那么该配置类将不会被正确填充。

简而言之,宽松映射规则主要关注于字段级别的属性名匹配,而不是prefix属性的匹配。prefix 需要直接且精确地匹配配置文件中的前缀。

@Value注解 & @ConfigurationProperties注解

@Value 注解和 @ConfigurationProperties 注解都是Spring框架提供的用于从配置文件中读取属性值的工具,但它们在使用方法、适用场景上各有侧重,形成了互补关系。

关系

互补性: 两者都是配置注入的手段,但 @Value 更适用于简单、零散的配置注入,而 @ConfigurationProperties 则适用于复杂、结构化的配置数据绑定。
功能覆盖: 在某种程度上,@ConfigurationProperties 的功能包含了 @Value ,因为它可以完成单个值的注入,同时也能处理多个相关联的配置属性,但反之不成立。

区别

@Value

  • 用法: 直接在字段或方法上使用,通过 ${...} 引用配置项。
  • 特点: 适合简单的配置项读取,支持SpEL表达式,灵活性高但对复杂结构配置管理不便。
  • 场景: 适用于少量独立配置项的注入,或者需要在表达式中动态计算的场合。
  • 优点: 简洁快速,无需定义额外的类,直接在需要的地方使用。
  • 示例:
    @Value("${database.url}") 
    private String dbUrl;

@ConfigurationProperties

  • 用法: 类级别注解,通常还需配合 @Component 或通过 @EnableConfigurationProperties 启用,使用 prefix 指定配置前缀。
  • 特点: 适用于结构化的配置,支持类型安全的绑定,简化大量配置管理,自动处理集合和嵌套属性,但对简单配置显得有些过度。
  • 场景: 适用于多个相互关联的配置项,特别是当这些配置形成一个逻辑上的整体时,如数据库、邮件服务器等配置。
  • 优点: 提供结构化配置,增强代码的可读性和可维护性,支持配置验证。
  • 示例: 在类上 @ConfigurationProperties(prefix = "app.datasource") ,类内定义相应字段。
版权声明:本文《@ConfigurationProperties》是由陶其原创撰写,首发于陶其的个人博客
转载声明:如需转载本文,请务必在转载处保留原文链接:https://www.tqazy.com/?p=562,并明确注明文章来源。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇