spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 @PropertySource 注解详解与对比

在这里插入图片描述
在这里插入图片描述


一、PropertySource 类详解

1. 类型与作用

  • 类型:接口(org.springframework.core.env.PropertySource
  • 作用:抽象配置数据源,提供统一的键值对访问接口,是 Spring 环境配置(Environment)的基础。

2. 核心方法

public interface PropertySource<S> {String getName(); // 获取属性源名称(如 "systemEnvironment")Object getProperty(String name); // 获取属性值(返回 Object 类型)S getSource(); // 获取原始资源对象(如文件或系统环境变量)
}

3. 常见实现类

实现类用途
MapPropertySourceMap 转换为属性源,用于内存中存储的键值对。
SystemEnvironmentPropertySource封装系统环境变量(如 JAVA_HOMEPATH)。
PropertiesPropertySource加载 application.properties*.properties 文件。
YamlPropertySource加载 application.yml*.yml 文件。

4. 使用场景

  • 底层实现:所有配置源(文件、环境变量、JNDI 等)均通过 PropertySource 接口统一管理。
  • 扩展性:开发者可自定义实现,如动态内存配置。

二、@PropertySource 注解详解

1. 类型与作用

  • 类型:注解(org.springframework.context.annotation.PropertySource
  • 作用:声明需要加载的外部属性文件路径,扩展 Spring 的配置源。

2. 核心属性

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PropertySource {String[] value() default {}; // 配置文件路径(如 "classpath:custom.properties")String[] name() default {}; // 属性源名称(可选)String encoding() default ""; // 文件编码(如 "UTF-8")Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class; // 自定义工厂
}

3. 使用场景

  • 声明式配置:在 @Configuration 类中声明额外的属性文件。
  • 扩展配置源:加载非默认的配置文件(如 custom.properties)。

4. 示例代码

@Configuration
@PropertySource(value = "classpath:custom.properties", encoding = "UTF-8")
public class AppConfig {@Value("${custom.key}")private String customValue;
}

三、核心区别对比
对比维度PropertySource@PropertySource
类型接口(Spring 核心环境模块)注解(Spring 配置注解模块)
作用抽象配置数据源,提供键值对访问接口。声明需要加载的属性文件路径,扩展配置源。
实现方式需实现接口或使用内置实现类(如 PropertiesPropertySource)。通过注解标注配置类,由 Spring 自动加载文件并转换为 PropertySource
使用层级Spring 环境的基础组件,直接参与 Environment 的管理。配置类的注解,用于声明性扩展配置源。
数据来源支持所有类型(文件、环境变量、内存等)。仅支持文件(需通过 factory 属性扩展)。
优先级控制通过 EnvironmentPropertySources 集合的顺序控制优先级。默认按加载顺序添加到 PropertySources,可通过 @Order 调整。
扩展性可自定义实现类,灵活度高。通过 factory 属性指定工厂,间接支持自定义数据源。

四、关联性
  1. 生命周期流程

    • @PropertySource 注解在 Spring 启动时被处理,通过 PropertySourcesPlaceholderConfigurerConfigurationClassPostProcessor 加载指定的属性文件。
    • 加载后的文件会被转换为 PropertySource 对象(如 PropertiesPropertySource),并注册到 EnvironmentPropertySources 集合中。
  2. 示例流程

    // 1. 使用 @PropertySource 声明配置文件
    @Configuration
    @PropertySource("classpath:custom.properties")
    public class AppConfig {}// 2. Spring 内部处理:
    //   - 读取 custom.properties 文件内容
    //   - 转换为 PropertiesPropertySource 实现类
    //   - 注册到 Environment 的 PropertySources 集合中
    

五、总结表格
特性PropertySource@PropertySource
类型接口(org.springframework.core.env注解(org.springframework.context.annotation
核心作用封装配置数据源,提供键值对访问接口。声明需要加载的属性文件路径,扩展配置源。
使用场景实现底层配置源(如文件、环境变量、内存等)。在配置类中声明性加载外部属性文件。
数据来源支持任意类型(文件、系统环境、JNDI 等)。仅支持文件(需通过工厂扩展)。
优先级控制通过 PropertySources 集合顺序控制。默认按加载顺序添加,可通过 @Order 调整。
扩展性高(可自定义实现类)。中(通过 factory 属性间接扩展)。

关键代码示例

1. 自定义 PropertySource 实现
public class CustomPropertySource implements PropertySource<String> {private final Map<String, Object> properties = new HashMap<>();private final String name;public CustomPropertySource(String name) {this.name = name;properties.put("custom.key", "value");}@Overridepublic Object getProperty(String name) {return properties.get(name);}@Overridepublic String getName() {return this.name;}
}// 注册到 Environment
@Configuration
public class AppConfig {@Autowiredprivate Environment environment;@PostConstructpublic void init() {ConfigurableEnvironment env = (ConfigurableEnvironment) environment;env.getPropertySources().addFirst(new CustomPropertySource("customConfig"));}
}
2. 使用 @PropertySource 注解
@Configuration
@PropertySource(value = "classpath:custom.properties", encoding = "UTF-8")
public class AppConfig {@Value("${custom.key}")private String customValue;
}

总结

  • PropertySource 是 Spring 配置系统的底层接口,用于抽象所有配置数据源,开发者可通过其实现类或自定义实现扩展配置能力。
  • @PropertySource 是声明式注解,简化了加载外部属性文件的流程,通过 Spring 的自动处理将其转换为 PropertySource 对象。
  • 两者共同作用:@PropertySource 通过声明路径触发配置文件加载,最终由 PropertySource 接口统一管理,实现灵活的配置管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

&#xff08;以下内容全部来自上述课程&#xff09; 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色&#xff1a;提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator&#xff1a;比较规则root&#xff1a;红黑树根节点的地址值size&#xff1a;集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright&#xff08;微软开源的跨浏览器自动化测试框架&#xff09;的 Model Context Protocol (MCP) 服务&#xff0c;核心功能是将浏览器自动化能力集成到大语言模型&#xff08;LLM&…

OSPF网络协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种链路状态路由协议&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内动态分发路由信息。它通过计算最短路径&#xff08;基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节&#xff0c;主要讲解了Ubuntu 22.04.4操作系统的安装&#xff0c;但是在实际生产环境中&#xff0c;需要对Ubuntu操作系统初始化&#xff0c;从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

【Linux应用】开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RADXA ZERO 3为例&#xff09; 参考&#xff1a; ZERO 3 | Radxa Docs 大部分的Linux开发板等设备都大同小异 如树莓派、香橙派、STM32MP135的Linux开发板等 …

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升&#xff0c;我们需要对这些用户数据进行挖掘&#xff0c;传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…

Unity ML-Agents + VScode 环境搭建 Windows

安装Unity 先去官网下载Unity Hub&#xff0c;然后安装在D盘就可以了&#xff0c;你需要手机上安装一个Unity Connect进行账号注册。 详细的注册可以参考&#xff1a; https://blog.csdn.net/Dugege007/article/details/128472571 注册好了以后登入电脑端的Unity Hub&#x…

Linux电源管理(2)_常规的电源管理的基本概念和软件架构

原文&#xff1a; Linux电源管理(2)_Generic PM之基本概念和软件架构 1. 前言 Linux系统中那些常规的电源管理手段&#xff0c;包括关机&#xff08;Power off&#xff09;、待机&#xff08;Standby or Hibernate&#xff09;、重启&#xff08;Reboot&#xff09;等。这些…

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…

在线教育系统开发常见问题及解决方案:源码部署到运营维护

当下&#xff0c;越来越多的教育机构、企业培训部门以及创业者&#xff0c;选择开发属于自己的在线教育系统。然而&#xff0c;从源码部署到实际运营&#xff0c;整个过程中常常会遇到一系列技术与管理难题。今天&#xff0c;笔者将从在线教育系统源码维护、运营等几个方向为大…

RAG(Retrieval-Augmented Generation,检索增强生成)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合 信息检索 和 文本生成 的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生成内容的准确性和时效性。其核心思想是&#xff1a;先检索相关知识&#xff0c;再基…

项目实战 -- 状态管理

redux基础 还记得好久好久之前就想要实现的一个功能吗&#xff1f; 收起侧边栏折叠菜单&#xff0c;没错&#xff0c;现在才实现 因为不是父子通信&#xff0c;所以处理起来相对麻烦一点 可以使用状态树或者中间人模式 这就需要会redux了 Redux工作流&#xff1a; 异步就…

Go语言之路————指针、结构体、方法

Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go…

[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

前言&#xff1a; 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素&#xff0c;它弥漫在系统中多维立体空间的不同节点上&am…

JS执行器在UI自动化测试中的应用

前言 在进行UI自动化过程会遇到滚动条下拉、隐藏元素定位、只读属性元素的编辑、富文本处理等&#xff0c;此时可以使用JS执行器简化我们的一些处理操作。 具体应用 JS执行器的使用步骤&#xff1a; 1.先写个JS脚本&#xff0c;如果需要获取操作后的值&#xff0c;JS脚本前面…

解析Suna:全球首款开源通用AI智能体

导语&#xff1a; 嘿&#xff0c;哥们儿&#xff0c;最近 AI Agent 这块儿挺火的&#xff0c;有个叫 Suna 的开源项目冒出来挺快&#xff01;听说只用了 3 周就开发出来了&#xff0c;但功能上感觉已经能跟那个商业版的 Manus掰掰手腕了。它能帮你搞定浏览器自动化、管文件、爬…

模板方法模式:定义算法骨架的设计模式

模板方法模式&#xff1a;定义算法骨架的设计模式 一、模式核心&#xff1a;模板方法定义算法骨架&#xff0c;具体步骤延迟到子类实现 在软件开发中&#xff0c;经常会遇到这样的情况&#xff1a;某个算法的步骤是固定的&#xff0c;但具体步骤的实现可能因不同情况而有所不…

浅谈Java 内存管理:栈与堆,垃圾回收

在Java编程世界里&#xff0c;内存管理是一项极为关键的技能&#xff0c;它就像程序运行背后的“隐形守护者”&#xff0c;默默影响着程序的性能与稳定性。今天&#xff0c;咱们就来简单学习一下Java内存管理中的两大核心要点&#xff1a;栈与堆的内存分配机制&#xff0c;以及…

【WebGL小知识】WebGL平台上不同Json的比较

今天来总结一下WebGL平台上不同Json插件的差别&#xff0c;话不多说直接开始。 JsonUtility JsonUtility是Unity自带的Json解析&#xff0c;无需另外安装插件。 优点&#xff1a; Unity自带&#xff0c;兼容性好&#xff0c;WebGL平台可以使用轻量级&#xff0c;性能较好。 …

4.22tx视频后台开发一面

总时长大概在一个小时&#xff0c;主要提问C、操作系统、计网以及数据库等方面&#xff0c;最后两个算法编程题。 一上来先介绍项目 Linux下的mybash命令处理器和内存池 mybash可以再总结归纳一下&#xff0c;一上来有点紧张没有条理 内存池是用边界标识法写的&#xff0c;…