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应用中的配置。

相关推荐
互联网搬砖老肖3 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
典学长编程3 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
积跬步,慕至千里4 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
极限实验室5 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库
白仑色5 小时前
Oracle PL/SQL 编程基础详解(从块结构到游标操作)
数据库·oracle·数据库开发·存储过程·plsql编程
程序猿小D6 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
钢铁男儿7 小时前
C# 接口(什么是接口)
java·数据库·c#
__风__8 小时前
PostgreSQL kv(jsonb)存储
数据库·postgresql
轩情吖8 小时前
Qt的第一个程序(2)
服务器·数据库·qt·qt creator·qlineedit·hello world·编辑框
Databend8 小时前
Databend 产品月报(2025年6月)
数据库