1. 程式人生 > >Spring 中如何向 Bean 注入系統屬性或環境變數

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, .......}