Spring/Boot/Cloud系列知識(6)——Spring EL(2)

(接上文《Spring/Boot/Cloud系列知識(5)——Spring EL(1)》)

3、Spring EL 與第三方信息

3.1、Spring EL 與 集合

Spring EL基本表達式可以對集合中的信息進行讀取操作,包括Collection、Map性質的集合。請看如下實例:

/**
 * 在這個bean被初始化時,進行集合數據的添加
 * @author yinwenjie
 */
@Component("myCollection")
public class CollectionPojo {
  private List<String> myList;
  private Map<String, Object> myMap;
  /**
   * 保證spring在構造這個bean實例時
   * 就向兩個集合中寫入了數據
   */
  public CollectionPojo() {
    this.myList = Arrays.asList(new String[]{"數據1","數據2","數據3","數據4"});
    this.myMap = new HashMap<>();
    myMap.put("key1", "value1");
    myMap.put("key2", "value2");
    myMap.put("key3", "value3");
  }
  ......
}

以上代碼我們在myCollection這個bean被Spring容器初始化時,向bean中兩種類型的集合屬性寫入了一些初始化值。接下來,我們通過@Value關鍵字,在依賴於這個bean的其它bean實例中,對屬性進行賦值:

@Component("collectioSpel")
public class CollectionSpel {
  // 從列中取值
  @Value("#{myCollection.myList[0]}")
  private String value1;
  // 從鍵值對中取值
  @Value("#{myCollection.myMap['key1']}")
  private String value2;
  ......
}

這樣一來,“value1”屬性將得到“數據1”這個初始值,“value2”屬性將得到“value1”這個初始化值。當然,在以上給出的“對myCollection bean進行初始化”的代碼中,Spring XML還給出了一種配置方式,只是本專題中主要講解是基於Spring boot的,所以就沒有過多講解Spring XML中的寫法,這裏給出補充的內容(通過XML進行myCollection bean中屬性的初始化賦值):

......
<bean id="myCollection" class="...">
  <property name="addressList">
    <list>
      <ref bean="address1"/>
       <ref bean="address2"/>
       <value>Pakistan</value>
    </list>
  </property>
</bean>
......

3.2、Spring EL 與 配置(環境)信息

Spring EL 可以通過“$”關鍵字取得操作系統環境變量信息、應用程序運行時信息,以及應用程序配置文件中的信息。其中的原理是Spring中實現的某個配置信息獲取配置器“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”和“org.springframework.context.support.PropertySourcesPlaceholderConfigurer”。前者爲Spring 3.1之前的版本提供,而Spring 3.1之後的版本多采用後者(但是前者PropertyPlaceholderConfigurer並沒有被放棄使用,詳細情況讀者可參見這兩個類的官方註釋)。

接下來我們來看看Spring EL通過“$”關鍵字如何取得操作系統環境變量信息、應用程序運行時信息,以及應用程序配置文件中的信息:

......
/**
 * 這個值來源於系統默認的配置文件中,
 * 文件名爲application.yml或者application.properties
 */
@Value("${local.param1}")
private String value1;
/**
 * 從環境變量中取出PATH
 */
@Value("${PATH}")
private String path;
/**
 * 從環境變量中取出CLASSPATH
 */
@Value("${CLASSPATH}")
private String classpath;
/**
 * 取出應用程序的運行狀態
 * 當前操作系統名字
 */
@Value("${os.name}")
private String osName;
/**
 * 取出應用程序的運行狀態
 * 當前運行應用程序的用戶的工作目錄
 */
@Value("${user.dir}")
private String userDir;
/**
 * 取出應用程序的運行狀態
 * 當前運行應用程序的用戶的主目錄
 */
@Value("${user.home}")
private String userHome;
/**
 * 取出應用程序的運行狀態
 * 當前運行應用程序的用戶的賬戶名
 */
@Value("${user.name}")
private String userName;
/**
 * 取出應用程序的運行狀態
 * 當前jvm版本,注意不是jdk版本
 */
@Value("${java.vm.version}")
private String jvmVersion;
......

請注意,我們以上代碼使用的示例環境爲Spring Boot。後者爲我們節省了大部分配置工作,例如我們可以直接將應用程序相關配置信息放置在規定的application.yml或者application.properties文件中,而無需在某個application.xml中指定配置文件。那麼我們怎麼知曉哪些操作系統環境變量信息、應用程序運行時信息可以通過“$”關鍵字進行加載呢?

  • 操作系統環境變量信息就是我們在Linux操作系統中(以CentOS操作系統爲例),通過env命令能夠獲取到的那些環境變量信息。在java語言中我們可以通過以下代碼將這些信息加載出來:
......
// Returns an unmodifiable string map view of the current system environment. 
// The environment is a system-dependent mapping from names to values which is passed from parent to child processes. 
// If the system does not support environment variables, an empty map is returned. 

Map<String, String> envs = System.getenv();
......

以下輸出的調試信息,是筆者在自己的代碼開發環境下得到的環境變量信息結果(由於篇幅原因,省去了部分):

......
PATH=D:\Program Files\Java\jdk1.8.0_144\jre\bin;D:/Program Files/Java/jdk1.8.0_144/bin/..,
USERDOMAIN_ROAMINGPROFILE=SC-201709191410, 
LOCALAPPDATA=C:\Users\Administrator\AppData\Local, 
PROCESSOR_LEVEL=6, 
SYSTEMDRIVE=C:, 
COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files, 
USERDOMAIN=SC-201709191410, 
FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer, 
LOGONSERVER=\\SC-201709191410, 
JAVA_HOME=D:\Program Files\Java\jdk1.8.0_144, 
PROMPT=$P$G, 
SESSIONNAME=Console, 
ALLUSERSPROFILE=C:\ProgramData, 
PROGRAMFILES(X86)=C:\Program Files (x86), 
......
USERPROFILE=C:\Users\Administrator, 
TMP=C:\Users\ADMINI~1\AppData\Local\Temp, 
PUBLIC=C:\Users\Public, 
NUMBER_OF_PROCESSORS=8
......
  • 而應用程序的運行時信息,是在應用程序運行過程中動態生成的信息。在java環境中,這些信息可以通過以下代碼獲得:
......
Properties properties = System.getProperties();
properties.list(System.out);
......

而在這個方法的官方註釋中,也對這些應用程序運行時信息進行了部分說明(實際上根據操作系統的不同,信息還可能更多),參見以下的引用信息:

java.version: Java Runtime Environment version
java.vendor: Java Runtime Environment vendor
java.vendor.url: Java vendor URL
java.home: Java installation directory
java.vm.specification.version: Java Virtual Machine specification version
java.vm.specification.vendor: Java Virtual Machine specification vendor
java.vm.specification.name: Java Virtual Machine specification name
java.vm.version: Java Virtual Machine implementation version
java.vm.vendor: Java Virtual Machine implementation vendor
java.vm.name: Java Virtual Machine implementation name
java.specification.version: Java Runtime Environment specification version
java.specification.vendor: Java Runtime Environment specification vendor
java.specification.name: Java Runtime Environment specification name
java.class.version: Java class format version number
java.class.path: Java class path
java.library.path: List of paths to search when loading libraries
java.io.tmpdir: Default temp file path
java.compiler: Name of JIT compiler to use
java.ext.dirs: Path of extension directory or directories Deprecated. This property, and the mechanism which implements it, may be removed in a future release.
os.name: Operating system name
os.arch: Operating system architecture
os.version: Operating system version
file.separator: File separator (“/” on UNIX)
path.separator: Path separator (“:” on UNIX)
line.separator: Line separator (“\n” on UNIX)
// 這個屬性已經演示過,代表啓動當前應用程序的登錄用戶名
user.name: User’s account name
// 這個屬性也已經演示過,代表啓動當前應用程序的用戶,所使用的主目錄
user.home: User’s home directory
// 這個屬性也已經演示過,代表啓動當前應用程序的用戶的工作目錄
user.dir: User’s current working directory

========================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章