Skip to content

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 年配置管理的正确姿势,这才是面试的区分点:

  1. 配置分层:代码内默认值 → application.yml(环境骨架)→ 环境变量/K8s ConfigMap(部署差异)→ Nacos 配置中心(运行时动态)。@PropertySource 只覆盖第一二层;
  2. 敏感配置不入库:密钥类走 K8s Secret 或 Vault,@PropertySource 引文件的方式天然有泄露风险(文件进 git);
  3. 配置即资产:配置项要有命名规范(模块前缀)、变更审计(配置中心自带)、灰度能力——这些能力决定了配置变更的业务风险可控。

一句话:注解本身一分钟讲完,能顺势讲清配置管理分层与配置中心化的演进逻辑,才体现架构视野。

🏗 系统架构师 ​

作用:向 Spring Environment 注入额外属性源——@PropertySource("classpath:xxx.properties") 配合 @Value/@ConfigurationProperties 读取。默认不直接支持 yml(需扩展 factory)。

架构视角:本质是「属性源的层级拼装」。Environment 内部 PropertySource 是有序列表,优先级决定覆盖关系——理解这一点比记注解更重要。

实践判断:

  1. 单体时代它解决多配置文件分域管理(db.properties、mq.properties);Boot 时代已被配置分层机制取代(application-{profile}.yml、spring.config.import),新项目我不再用它;
  2. 仍有价值的场景:遗留系统迁移需要把老配置文件原样挂进来;以及自定义 PropertySource 扩展——比如加解密属性源(配合 jasypt 做配置加密)、运行期动态属性源;
  3. 配置治理的演进终点是配置中心(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 拆出去。

注意点:

  1. 默认不支持 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)
  1. 它加载的属性优先级低于 application.yml(Boot 配置文件后加载会覆盖),混用时容易困惑
  2. ignoreResourceNotFound = true 让文件缺失不报错(多环境可选配置)
  3. Boot 项目更推荐 @ConfigurationProperties + 标准配置文件,@PropertySource 多见于遗留系统改造和框架集成