当前位置: 首页 > news >正文

ConfigurationProperties和PropertySource两个注解的区别。

在Spring框架中,@ConfigurationProperties@PropertySource是两个功能不同但常结合使用的注解,主要区别如下:


1. 核心职责

注解核心职责
@PropertySource定义属性来源:指定外部配置文件(如.properties.yml),将其内容加载到Spring的Environment中。
@ConfigurationProperties属性绑定:将Environment中的属性批量绑定到Java对象的字段,支持类型安全和松散绑定。

2. 使用场景

@PropertySource
  • 适用场景:需要引入非默认配置文件(如custom.properties)。
  • 示例
    @Configuration
    @PropertySource("classpath:custom.properties") // 加载自定义配置文件
    public class AppConfig { ... }
    
  • 特点
    • 默认支持.properties文件,若需加载YAML需额外配置。
    • 多个@PropertySource可叠加使用,按声明顺序加载(后加载的属性可能覆盖前者)。
@ConfigurationProperties
  • 适用场景:将一组相关属性(如数据库配置)映射到Java对象,避免逐个使用@Value
  • 示例
    @Component
    @ConfigurationProperties(prefix = "database") // 绑定前缀为"database"的属性
    public class DatabaseConfig {
        private String url;
        private String username;
        // getters/setters...
    }
    
  • 特点
    • 支持类型转换(如字符串"8080"转整型int)。
    • 需配合@EnableConfigurationProperties或在配置类中声明为Bean。

3. 协同工作流程

  1. 加载属性:通过@PropertySourcecustom.properties中的属性注入Environment
  2. 绑定属性@ConfigurationPropertiesEnvironment中提取匹配前缀的属性,填充到Java对象。
# custom.properties
database.url=jdbc:mysql://localhost:3306/mydb
database.username=root
@Configuration
@PropertySource("classpath:custom.properties")
@EnableConfigurationProperties(DatabaseConfig.class)
public class AppConfig { ... }

4. 关键区别总结

特性@PropertySource@ConfigurationProperties
作用目标类(配置类)类(配置类或Bean)
主要功能加载外部属性到EnvironmentEnvironment中的属性绑定到Java对象
属性覆盖支持多文件,后者覆盖前者依赖Environment中最终生效的属性值
类型安全无(需手动处理类型转换)有(自动类型转换)
松散绑定支持支持(如kebab-casecamelCase

5. 常见误区

  • @ConfigurationProperties依赖@PropertySource
    不一定。只要属性存在于Environment(如默认application.properties或通过其他方式加载),即可直接绑定。
  • @PropertySource只能加载.properties文件?
    默认是,但可通过自定义PropertySourceFactory实现加载YAML等格式。

最佳实践

  • 组合使用:用@PropertySource引入外部配置,再用@ConfigurationProperties实现类型安全绑定。
  • 优先级管理:Spring Boot中属性源按特定顺序加载(如命令行参数 > 系统变量 > 配置文件),需注意属性覆盖逻辑。

通过理解二者的职责和协作方式,可以更高效地管理Spring应用中的配置。

相关文章:

  • 案例分享(七):实现Apache-sharding-proxy的监控
  • 【redis】简介及在springboot中的使用
  • 学习比较JVM篇(六):解读GC日志
  • [ctfshow web入门] web16
  • 离散数学问题集--问题5.9
  • 【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
  • flink Shuffle的总结
  • [ctfshow web入门] web19
  • 第四讲:类与对象(下)
  • 如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
  • mapbox基础,加载栅格图片到地图
  • QMT实盘代码案例教学:etf全球配置策略
  • 深入理解Java性能调优与JVM底层机制
  • 柯尼卡美能达CA-410-CA-VP427 P427
  • 从 “单打独斗” 到 “生态共赢” 跨境货源池的协同增长逻辑
  • 摄像头模块对焦方式的类型
  • Java基础 4.7
  • 基于Python的二手房数据挖掘与可视化深度分析
  • STM32单片机入门学习——第22节: [7-2] AD单通道AD多通道
  • AutoAgent: 香港大学开源的AI智能体框架
  • 武汉值得去的互联网公司/北京快速优化排名
  • 网上哪里给公司做网站/2024政治时政热点
  • wordpress 畅言代码/seo这个职位是干什么的
  • 网站怎么推广运营/深圳网络推广软件
  • 做我的世界壁纸的网站/seo网站制作优化
  • 百度网站优化/网页制作图片