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

相关推荐
焱焱枫43 分钟前
Oracle 数据布局探秘:段与区块的内部机制
数据库·oracle
焱焱枫2 小时前
深入理解 Oracle 数据块:行迁移与行链接的性能影响
数据库·oracle
长流小哥2 小时前
MySQL零基础入门:Ubuntu环境安装与操作精解
数据库·sql
临界点oc2 小时前
Redis从入门到实战 - 高级篇(上)
数据库·redis·缓存
电商数据girl5 小时前
【Python爬虫电商数据采集+数据分析】采集电商平台数据信息,并做可视化演示
java·开发语言·数据库·爬虫·python·数据分析
杨云龙UP6 小时前
SQL 中的中括号 [ ]、双引号 “ “、反引号 ` `:SQL Server、Oracle、MySQL三大数据库标识符 定界符 详解
数据库·sql·mysql·postgresql·oracle·sqlserver
qqxhb7 小时前
零基础学Java——第九章:数据库编程(三)
java·数据库·spring·mybatis
Leo.yuan8 小时前
直播数据大屏是什么?企业应如何构建直播数据大屏?
大数据·数据库·python·信息可视化·数据分析
2401_837088508 小时前
Mysql group by 用法
数据库·mysql
西门吹雪@1329 小时前
阿里云服务器-centos部署定时同步数据库数据-dbswitch
服务器·数据库·阿里云