@propertysource适用于加载固定路径、非profile化、非spring boot自动管理的配置文件,如外部系统级配置或第三方模块私有属性,但不参与spring boot配置优先级和profile激活机制。

在 Spring Boot 中,@PropertySource 可以用来加载自定义的 properties 文件,但它和 Spring Boot 的自动配置机制存在冲突点——默认不推荐直接使用,因为会绕过 application.properties 的优先级处理和 Profile 激活逻辑。不过在特定场景下(如加载外部配置、兼容老项目),它仍可谨慎使用。
明确 @PropertySource 的适用场景
它适合加载固定路径、非 Profile 化、非 Spring Boot 自动管理的配置文件,比如:
- 放在 classpath 外的系统级配置(如
/etc/myapp/config.properties) - 需要与主配置隔离的第三方模块私有属性
- 迁移传统 Spring 应用时保持原有
@PropertySource写法
注意:它不能自动识别 application-dev.properties 这类 Profile 文件,也不会参与 Spring Boot 的配置文件加载顺序(如 config/ 目录、命令行参数等)。
基础用法:配合 @Configuration 类使用
必须将 @PropertySource 放在带有 @Configuration 的类上,且该类需被 Spring 扫描到:
@Configuration
@PropertySource("classpath:custom.properties")
public class CustomConfig {
}
其中 custom.properties 需位于 src/main/resources/ 下。若文件不存在,启动会报错;加 ignoreResourceNotFound = true 可静默忽略:
@PropertySource(value = "classpath:custom.properties", ignoreResourceNotFound = true)
加载外部文件(如绝对路径或相对路径)
支持 file: 前缀读取外部文件:
-
@PropertySource("file:/opt/config/app.properties")—— 绝对路径 -
@PropertySource("file:./config/local.properties")—— 相对路径(相对于 JVM 启动目录)
注意:file: 路径在不同环境(如 Docker 容器)中需确保文件存在且权限可读;Spring Boot 默认不监控外部 properties 文件变更,修改后需重启应用。
与 @Value 和 Environment 配合取值
加载后,可用标准方式注入属性:
@Value("${my.custom.value:default}")
private String customValue;
@Autowired
private Environment env;
// 在代码中获取
String value = env.getProperty("my.custom.value");
如果属性名冲突(比如 custom.properties 和 application.properties 都定义了 server.port),@PropertySource 加载的属性优先级低于 Spring Boot 默认配置源(如 application.yml、命令行参数),不会覆盖它们。
不复杂但容易忽略:想让自定义配置参与自动配置(如 @ConditionalOnProperty),建议改用 spring.config.import 或 spring.config.additional-location,它们更符合 Spring Boot 的配置模型。











