實際開發中,數據庫連接參數、第三方服務配置等不宜硬編碼,通常放在 .properties 文件中。Spring 提供了三種主要方式載入並使用這些配置。
<!-- 載入單個文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 支持通配符批量載入 -->
<context:property-placeholder location="classpath:db*.properties"/>
db.properties 示例:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.8.32:3306/test
db.username=root
db.passwd=root
在 XML 中使用(${...} 語法):
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.passwd}"/>
</bean>
在 Java 代碼中注入(@Value):
@Component
public class DbConfig {
@Value("${db.driver}") private String driver;
@Value("${db.url}") private String url;
@Value("${db.username}") private String username;
@Value("${db.passwd}") private String password;
// getter/setter...
}
<bean id="appProperty" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<array>
<value>classpath:quartz.properties</value>
<value>classpath:db.properties</value>
</array>
</property>
</bean>
使用方式與方式一完全一致(${...} 和 @Value("${...}"))。
注意:<context:property-placeholder>和PropertyPlaceholderConfigurer兩種方式在 Spring 容器中只能二擇一生效。容器採用反射掃描,若已存在PropertyPlaceholderConfigurer實例,則不會再創建第二個。建議統一使用方式一。
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:quartz.properties</value>
<value>classpath:db.properties</value>
</list>
</property>
</bean>
XML 中使用:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"/> <!-- 方式一語法 -->
<property name="url" value="#{configProperties['db.url']}"/> <!-- SpEL 語法 -->
<property name="username" value="#{configProperties['db.username']}"/>
<property name="password" value="123456"/>
</bean>
Java 代碼中注入:
@Value("#{configProperties['db.username']}")
private String dbUsername;
查看 UML 類圖可見,location/locations 屬性定義在共同父類 PropertiesLoaderSupport(抽象類)中,三種方式本質上都是通過該父類統一載入處理。
spring.profiles.active 載入 db-dev.properties、db-prod.propertiesPropertySourcesPlaceholderConfigurer 解密${...} 或 #{...},減少認知負荷