Spring 中的 @PropertySource 注解的作用是什么?
- 标签:后端、Spring
🏛 业务架构师
@PropertySource 的作用是把指定的 properties 文件纳入 Spring 的 Environment,让里面的配置项能被 @Value 或 @ConfigurationProperties 读取:
java
@Configuration
@PropertySource("classpath:pay-channel.properties")
public class PayConfig { ... }业务架构师视角,这个注解的历史角色大于当下角色:传统 Spring 项目里,配置散在多个 properties 文件,需要它逐个声明引入;Spring Boot 之后,application.yml 及其 Profile 变体(application-prod.yml)自动加载,多文件场景大幅减少,这个注解主要残留在遗留系统维护和第三方 jar 内置配置场景。
我更想借这题讲2026 年配置管理的正确姿势,这才是面试的区分点:
- 配置分层:代码内默认值 →
application.yml(环境骨架)→ 环境变量/K8s ConfigMap(部署差异)→ Nacos 配置中心(运行时动态)。@PropertySource 只覆盖第一二层; - 敏感配置不入库:密钥类走 K8s Secret 或 Vault,
@PropertySource引文件的方式天然有泄露风险(文件进 git); - 配置即资产:配置项要有命名规范(模块前缀)、变更审计(配置中心自带)、灰度能力——这些能力决定了配置变更的业务风险可控。
一句话:注解本身一分钟讲完,能顺势讲清配置管理分层与配置中心化的演进逻辑,才体现架构视野。
🏗 系统架构师
作用:向 Spring Environment 注入额外属性源——@PropertySource("classpath:xxx.properties") 配合 @Value/@ConfigurationProperties 读取。默认不直接支持 yml(需扩展 factory)。
架构视角:本质是「属性源的层级拼装」。Environment 内部 PropertySource 是有序列表,优先级决定覆盖关系——理解这一点比记注解更重要。
实践判断:
- 单体时代它解决多配置文件分域管理(db.properties、mq.properties);Boot 时代已被配置分层机制取代(application-{profile}.yml、
spring.config.import),新项目我不再用它; - 仍有价值的场景:遗留系统迁移需要把老配置文件原样挂进来;以及自定义 PropertySource 扩展——比如加解密属性源(配合 jasypt 做配置加密)、运行期动态属性源;
- 配置治理的演进终点是配置中心(Nacos/Apollo)加密钥管理(Vault/K8s Secret)——静态文件只保留兜底快照职责,敏感信息不落 Git。
💻 全栈开发专家
把额外的 properties 文件装进 Spring Environment,供 @Value/@ConfigurationProperties 读取:
java
@Configuration
@PropertySource("classpath:sms.properties")
public class SmsConfig {
@Value("${sms.app-id}") private String appId;
}典型用途:第三方 SDK 要求独立配置文件、或把错误码/白名单这类映射表从 application.yml 拆出去。
注意点:
- 默认不支持 yml,只认 properties。要加载 yml 得自定义工厂:
java
public class YamlSourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource res) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(res.getResource());
Properties props = factory.getObject();
return new PropertiesPropertySource(name, props);
}
}
// 用法:@PropertySource(value = "classpath:a.yml", factory = YamlSourceFactory.class)- 它加载的属性优先级低于 application.yml(Boot 配置文件后加载会覆盖),混用时容易困惑
ignoreResourceNotFound = true让文件缺失不报错(多环境可选配置)- Boot 项目更推荐
@ConfigurationProperties+ 标准配置文件,@PropertySource多见于遗留系统改造和框架集成