PropertyPlaceholderConfigurer 是 Spring 早期用于解析 ${key} 占位符的 BeanFactoryPostProcessor,通过 XML 配置加载 classpath 或文件系统属性文件,按顺序覆盖同名键,支持 systemPropertiesMode 控制环境变量优先级,但不支持嵌套占位符和默认值,且需注意编码与注册时机。

Spring 使用 PropertyPlaceholderConfigurer 加载外部配置,核心是让 Spring 容器在启动时解析占位符(如 ${jdbc.url})并用外部属性值替换。它适用于 XML 配置时代(Spring 3.x 及更早),虽然后续被 PropertySourcesPlaceholderConfigurer(Spring 3.1+)和基于 @ConfigurationProperties 或 @Value 的现代方式替代,但在维护老项目或特定场景中仍有使用价值。
配置 PropertyPlaceholderConfigurer(XML 方式)
在 Spring XML 配置文件(如 applicationContext.xml)中声明该 Bean,指定外部属性文件路径:
- 支持 classpath 路径:
classpath:config.properties - 支持文件系统路径:
file:/opt/myapp/config.properties - 可配置多个文件,用逗号分隔:
classpath:default.properties,classpath:env-specific.properties - 建议设置
ignoreUnresolvablePlaceholders="false"(默认为 false),便于快速发现拼写错误的占位符
示例:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:database.properties</value>
<value>file:${user.home}/app-config.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="false"/>
</bean>
在 Bean 定义中使用占位符
一旦配置生效,即可在 XML 中通过 ${key} 注入属性值:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
对应 database.properties 内容示例:
jdbc.url=jdbc:mysql://localhost:3306/mydb jdbc.username=root jdbc.password=123456
处理属性优先级与覆盖
PropertyPlaceholderConfigurer 按 locations 中声明的顺序加载属性文件,后加载的同名 key 会覆盖前面的值。
- 若需支持系统环境变量或 JVM 参数覆盖,可设置
systemPropertiesModeName属性,例如:SYSTEM_PROPERTIES_MODE_OVERRIDE - 也可配合
order属性控制多个配置器的执行顺序(当存在多个时)
注意事项与常见问题
该类是 BeanFactoryPostProcessor,必须在容器刷新前注册;不能用 @Bean 在 Java Config 中直接返回它(Spring 3.1+ 推荐用 PropertySourcesPlaceholderConfigurer)。
- 属性文件编码默认为 ISO-8859-1,中文需转 Unicode 或显式指定
fileEncoding="UTF-8"(Spring 4.1+ 支持) - 占位符语法不支持嵌套(如
${${env}.url}),也不支持默认值(${jdbc.url:jdbc:h2:mem:testdb}是新版本特性,旧版不支持) - 若属性未定义且
ignoreUnresolvablePlaceholders=true,占位符将原样保留,可能导致运行时异常

















