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

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员8 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴8 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存