@propertysource用于显式加载指定路径属性文件,但不自动覆盖spring boot默认配置,需配合@configuration使用,支持classpath、file://等路径,优先级低于application.properties。

在 Spring 环境下,@PropertySource 可以用来显式加载指定路径的属性文件(如 application.properties 或自定义的 xxx.properties),但需注意它**不会自动覆盖或合并 Spring Boot 默认加载的配置文件**,且路径解析有特定规则。
支持的路径类型和写法
@PropertySource 支持 classpath 路径、文件系统绝对路径、以及带协议的 URL(如 file://)。常见写法如下:
-
classpath 下文件:直接写文件名或带路径,如
@PropertySource("classpath:config/custom.properties") -
绝对文件路径:用
file:协议前缀,如@PropertySource("file:/opt/app/config/db.properties") -
相对路径(不推荐):Spring 不支持纯相对路径(如
"config/app.properties"),会报错找不到资源
必须配合 @Configuration 类使用
@PropertySource 只能标注在带有 @Configuration 的类上,不能放在启动类(@SpringBootApplication)或普通 Bean 类中(除非该类也声明为 @Configuration)。例如:
@Configuration
@PropertySource("classpath:config/my-config.properties")
public class MyConfig {
// 配置类内容
}
若放在非 @Configuration 类上,注解会被忽略,属性不会被加载。
属性值注入与优先级
通过 @Value 或 @ConfigurationProperties 可读取加载的属性,但要注意:
- 加载的属性会加入 Spring 的 Environment,但**优先级低于 application.properties 中同名属性**(除非手动调整 PropertySource 的顺序)
- 若需更高优先级,可实现
PropertySourceLocator自定义加载逻辑,或使用spring.config.import(Spring Boot 2.4+)替代 - 支持占位符解析,如
@Value("${my.db.url}"),前提是属性已成功加载
常见问题与避坑提示
实际使用中容易出错的地方:
-
中文乱码:默认按 ISO-8859-1 解析,需加
encoding = "UTF-8"参数:@PropertySource(value = "classpath:conf/msg_zh.properties", encoding = "UTF-8") -
文件不存在不报错:默认
ignoreResourceNotFound = false,即文件缺失会抛异常;设为true可静默忽略 - 多个 @PropertySource 加载顺序:按类中声明顺序生效,后声明的同名属性会覆盖前面的(仅对相同 key 生效)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











