Spring 中如何向 Bean 注入系統屬性或環境變數
在 Spring 中為 javabean 注入屬性檔案中的屬性值一般人都知道的,可以通過 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 引入一個屬性檔案,然後給 bean 指定屬性的時候就可以用 ${jdbc.url} 方式賦值了。比如在 Spring 中是這樣的配置:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
</bean>
bean 賦上系統屬性(System.getProperties() ) 中的值或環境變數(System.getenv() ) 中的值,根據程式所處的環境產生不同的行為,這樣我們無法事先在某個 properties 檔案預先設定好值的。
用 PropertyPlaceholderConfigurer 來讀取屬性檔案,有兩個子類:
org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer
org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer
前面那個應該是從系統配置或登錄檔裡要屬性,後面的可以從 ServletContext 取相關屬性值。
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 的 JavaDoc API 就會發現,它不光能從屬性檔案裡取值,也能從系統屬性,甚至是環境變數中取值。
public void setSystemPropertiesMode(int systemPropertiesMode)
public void setSearchSystemEnvironment(boolean searchSystemEnvironment)
從把系統屬性 user.dir 和環境變數 COMPUTERNAME 注入到 javabean
一. 要被注入系統屬性和環境變數的 Bean
/**
通過 Spring 來向其中注入系統屬性 workDir(${user.dir}, System.getProperty("")) * 和環境變數 hostName(${COMPUTERNAME}, System.getenv().get("COMPUTERNAME"));
* */
public class Environments {
private String workDir;
private String hostName;
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public String getWorkDir() {
return workDir;
}
public void setWorkDir(String workDir) {
this.workDir = workDir;
}
}
二. Spring 配置檔案
<?Xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<bean id="env" class="cc.unmi.spring.Environments">
<property name="workDir" value="${user.dir}"/>
<property name="hostName" value="${COMPUTERNAME}"/>
</bean>
</beans>
三. 測試客戶端程式碼
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cc.unmi.spring.Environments;
/** * 測試客戶端 * */
public class TestClient {
public static void main(String[] args) {
BeanFactory context = new ClassPathXmlApplicationContext("applicationContext.xml");
Environments env = context.getBean(Environments.class);
System.out.println("Working directory: " + env.getWorkDir());
System.out.println("Host name: " + env.getHostName());
}
}
四. 執行上面的 TestClient 後控制檯下輸出的結果是:
Working directory: D:\workspaces\j2ee\TestSpring
Host name: Unmi-Computer
這顯示了 Spring 已成功向 Environments 注入了系統屬性 user.dir 和環境變數 COMPUTERNAME。
注:你可以用 System.getProperties().list(System.out) 打印出系統屬性,還不知道系統中可用哪個命令查得到其中的值:顯示出來是這樣的:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jre6\bin
java.vm.version=17.1-b03
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=US
...................................
環境變數可以用 System.out.print(System.getenv()) 打印出來,對應著 Windows 中的 set 命令或 Linux 下的 env 輸出的值,System.getenv() 是個 Map,所以打印出這樣子的:
{USERPROFILE=C:\Documents and Settings\Unmi, JAVA_HOME=C:\Program Files\Java\jdk1.6.0_20, TEMP=C:\DOCUME~1\uqiu\LOCALS~1\Temp, OS=Windows_NT, COMPUTERNAME=Unmi-Computer, .......}