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

相关推荐
weixin_307779131 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
SelectDB2 小时前
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
数据库·人工智能·数据分析
我是哈哈hh2 小时前
【MySQL】在UBuntu环境安装以及免密码登录入门
linux·数据库·mysql·ubuntu
喪彪3 小时前
MySQL新手教学
数据库·mysql·adb
丘大梨5 小时前
QT 基础聊天应用项目文档
运维·数据库·系统架构
HMBBLOVEPDX6 小时前
MySQL的多版本并发控制(MVCC):
数据库·mysql·mvcc
.用户昵称已存在.6 小时前
MongoDB 从入门到精通:安装配置与基础操作指令详解
数据库·mongodb
ClouGence7 小时前
CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
数据库·sql·ci/cd
sukalot7 小时前
window显示驱动开发—在混合系统中使用跨适配器资源
数据库·驱动开发·音视频