ConfigurationProperties和PropertySource两个注解的区别。

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


1. 核心职责

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

2. 使用场景

@PropertySource
  • 适用场景 :需要引入非默认配置文件 (如custom.properties)。

  • 示例

    java 复制代码
    @Configuration
    @PropertySource("classpath:custom.properties") // 加载自定义配置文件
    public class AppConfig { ... }
  • 特点

    • 默认支持.properties文件,若需加载YAML需额外配置。
    • 多个@PropertySource可叠加使用,按声明顺序加载(后加载的属性可能覆盖前者)。
@ConfigurationProperties
  • 适用场景 :将一组相关属性 (如数据库配置)映射到Java对象,避免逐个使用@Value

  • 示例

    java 复制代码
    @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对象。
properties 复制代码
# custom.properties
database.url=jdbc:mysql://localhost:3306/mydb
database.username=root
java 复制代码
@Configuration
@PropertySource("classpath:custom.properties")
@EnableConfigurationProperties(DatabaseConfig.class)
public class AppConfig { ... }

4. 关键区别总结

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

5. 常见误区

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

最佳实践

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

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

相关推荐
小短腿的代码世界13 分钟前
Qt国际化深度解析:从源码到企业级多语言实践
java·数据库·qt
Ting-yu18 分钟前
Spring AI Alibaba零基础速成(6) ---- 向量化
数据库·人工智能
dishugj35 分钟前
HANA性能分析视图
数据库
l1t1 小时前
DeepSeek总结的在 DuckDB 中试驾 Lance 数据湖仓格式
数据库·人工智能·机器学习·duckdb
PaperData1 小时前
2017-2025年中国10米分辨率土地利用/覆盖栅格数据(from Esri LULC)
数据库·数据分析·学习方法
小二·2 小时前
LangGraph 多智能体实战:从零搭建 Multi-Agent 协作系统
java·开发语言·数据库
羑悻的小杀马特2 小时前
工业时序数据选型的几点思考:从存储成本与查询延迟说起
数据库·人工智能
小旭95272 小时前
商品详情实现与缓存问题(穿透、击穿、雪崩)解决方案
java·数据库·spring boot·后端·缓存
我本楚狂人www3 小时前
Spring 两大核心思想(一):IoC
java·数据库·spring
熊文豪3 小时前
标量子查询消除:一次让查询性能提升千倍的优化器手术
数据库·电科金仓