Spring 框架提供了多種途徑將外部配置屬性注入到 Bean 中,@Value 注解配合不同的配置源實現方式,可滿足從簡單到複雜的各類場景。本文系統梳理五種主流實現路徑,附帶完整 XML 與 Java 代碼示例,幫助開發者根據項目需求選擇最優方案。
假設存在屬性文件 dev.properties,內容如下:
tag=123
目標:將 tag 值注入到 Bean 字段 private String tag; 中。
${...} (經典模式)<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="dev.properties" />
</bean>
@Value("${tag}")
private String tag;
特點:Spring 早期核心方案,解析 XML 中所有 ${...} 佔位符,適用於傳統 XML 驅動項目。
${...}<bean id="appConfig" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location" value="dev.properties" />
</bean>
@Value("${tag}")
private String tag;
特點:功能類似 PropertyPlaceholderConfigurer,但基於 Java Preferences API,適合需系統級配置隔離的場景。
#{...}<bean id="config" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="dev.properties" />
</bean>
@Value("#{config['tag']}")
private String tag;
特點:將屬性文件暴露為 Properties Bean,通過 SpEL 索引取值,支持運行時動態計算與 Bean 間引用。
#{...} (簡化配置)Spring 提供 util 命名空間簡化 PropertiesFactoryBean 定義:
<util:properties id="config" location="dev.properties"/>
@Value("#{config['tag']}")
private String tag;
效果 與方式三完全等價,配置更簡潔,推薦使用。
直接在 XML 中定義屬性,適用於少量、固定、不想單獨維護文件的配置:
<bean id="appConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties">
<props>
<prop key="tag">123</prop>
</props>
</property>
</bean>
@Value("${tag}")
private String tag;
| 方式 | 配置複雜度 | 外部文件 | 表達式 | 推薦場景 |
|---|---|---|---|---|
| PropertyPlaceholderConfigurer | 低 | 是 | ${...} | 傳統 XML 項目,統一管理多文件 |
| PreferencesPlaceholderConfigurer | 低 | 是 | ${...} | 需系統級偏好設置隔離 |
| PropertiesFactoryBean | 中 | 是 | #{...} | 需 SpEL 動態計算、引用其他 Bean |
| util:properties | 低 | 是 | #{...} | 現代 Spring XML 簡化配置首選 |
| 內聯 props | 極低 | 否 | ${...} | 極少量固定配置、測試環境 |
在新項目中,強烈建議棄用上述 XML 配置,改用:
@PropertySource("classpath:dev.properties") + @Value("${tag}")@ConfigurationProperties(prefix="tag") 綁定到 POJO,獲得類型安全、鬆散綁定、JSR-303 校驗等能力。application.yml 定義,零配置自動綁定。理解這五種底層機制,有助於維護舊系統、排查注入失效問題,並在受限環境下做出正確技術選型。